首页 > 解决方案 > 将 pd.Dataframe 的特定单元格乘以 python 列表

问题描述

想象一下我们有数据框,让我们尝试像这样过滤它:

df[df[0] == 'Test_value'].iloc[:, 1:5] 

这样我们就按Test_value列中的值进行了过滤0,我们只取 1 到 5 列。现在我想从数据框中更改这些值。我想将它们乘以 [1,3,1,2] 之类的列表。

最后,我希望我的初始数据框仅在这些特定单元格中进行更改。

ps:df.mul()func 做得很好,但它只返回我更改的单元格(df[df[0] == 'Test_value].iloc[:, 1:5]),但我无法将它们设置为我的初始数据框:df[df[0] == 'Test_value].iloc[:, 1:5] = df[df[0] == 'Test_value].iloc[:, 1:5].mul(list)不工作((

标签: pythonpandaslistdataframe

解决方案


问题在于链索引,可能的解决方案是DataFrame.iloc仅通过将布尔掩码转换为 numpy 数组来过滤Series.to_numpy

df = pd.DataFrame({
        0:['Test_value'] *6,
         'B':[4,5,4,5,5,4],
         'C':[7,8,9,4,2,3],
         'D':[1,3,5,7,1,0],
         'E':[5,3,6,9,2,4],
         'F':[5,3,6,9,2,4],
})

dont use variable list because builtins
L = [1,3,1,2]
#pandas 0.24+
df.iloc[(df[0] == 'Test_value').to_numpy(), 1:5] *= L
#pandas below
#df.iloc[(df[0] == 'Test_value').values, 1:5] *= L
print (df)

            0  B   C  D   E  F
0  Test_value  4  21  1  10  5
1  Test_value  5  24  3   6  3
2  Test_value  4  27  5  12  6
3  Test_value  5  12  7  18  9
4  Test_value  5   6  1   4  2
5  Test_value  4   9  0   8  4

推荐阅读