2014-10-01 106 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)