2014-10-01 84 views
0

说我有一个数据帧:如何从数字中减去熊猫DataFrame的每一行?

ds = pd.DataFrame(np.abs(randn(3, 4)), index=[1,2,3], columns=['A','B','C','Average']) 
ds 
     A   B   C  Average 
1 1.099679 0.042043 0.083903 0.410128 
2 0.268205 0.718933 1.459374 0.758887 
3 0.680566 0.538655 0.038236 1.169403 

如何减(并用结果替换)A,B和C一行,平均1行?

+3

在文档中第一个例子:http://pandas.pydata.org /pandas-docs/dev/basics.html#matching-broadcasting-behavior – Jeff 2014-10-01 02:43:57

回答

1

大熊猫如何

ds['A'] = ds['A'] - ds['Average'] 
ds['B'] = ds['B'] - ds['Average'] 
ds['C'] = ds['C'] - ds['Average'] 

容易这样!

哦,这对整个DF来说都是如此。你只想要它的第一排是正确的?

ds.loc[1, 'A'] = ds.loc[1, 'A'] - ds.loc[1, 'Average'] 
ds.loc[1, 'B'] = ds.loc[1, 'B'] - ds.loc[1, 'Average'] 
ds.loc[1, 'C'] = ds.loc[1, 'C'] - ds.loc[1, 'Average'] 

或循环:

for col in ['A', 'B', 'C']: 
    ds.loc[1, col] = df.loc[1, col] - ds.loc[1, 'Average'] 

等等...

如果你有成千上万的列

后来干脆:

for col in ds.columns: 
    ds[col] = ds[col] - ds['Average'] 
+0

不,我希望它的整个数据帧,它有成千上万的行和列..有没有一种更简单的方法来做到这一点,而不需要明确指定列名? df.columns.values或类似的东西? – dana111 2014-10-01 02:34:29

+0

请参阅修改! – 2014-10-01 03:26:27

+0

此解决方案对我有帮助!谢谢你,哈哈 – 2017-08-03 18:07:33

2

一个相对简单的方法是使用sub方法(我假设Average总是最后一列):

ds[ds.columns[:-1]].sub(ds.Average, axis=0) 

这将执行以下操作:

  • ds[ds.columns[:-1]]是包含所有但ds最后一列(Average)一个数据帧。

  • .sub(ds.Average, axis=0)从DataFrame中相应的行中减去Average列中的行值。

要改变原来的ds,确保的ds相关列重新绑定到值的新数据框中:

ds[ds.columns[:-1]] = ds[ds.columns[:-1]].sub(ds.Average, axis=0)