2014-02-13 190 views
24

我有一個數據幀,是這樣的:熊貓據幀總行

 foo bar qux 
0 a 1 3.14 
1 b 3 2.72 
2 c 2 1.62 
3 d 9 1.41 
4 e 3 0.58 

,我想一個「總」行添加到數據框的末尾:

 foo bar qux 
0 a 1 3.14 
1 b 3 2.72 
2 c 2 1.62 
3 d 9 1.41 
4 e 3 0.58 
5 tot 15 9.47 

我已經試圖用sum命令,但我結束了一個系列,這雖然我可以轉換回一個數據幀,不保留數據類型:

tot_row = pd.DataFrame(df.sum()).T 
tot_row['foo'] = 'tot' 
tot_row.dtypes: 
    foo object 
    bar object 
    qux object 

我想從原始數據幀保持數據類型,因爲我需要其他操作適用於總行,是這樣的:

baz = 2*tot_row['qux'] + 3*tot_row['bar'] 
+7

嘗試'df.loc [ '總'] = df.sum()',從這個[鏈接]引用(http://stackoverflow.com/questions/20804673/appending-column-totals-to -a-pandas-dataframe) –

回答

20

附加一個彙總行與

df.append(df.sum(numeric_only=True), ignore_index=True) 

轉換僅當您有一列字符串或對象時纔有必要。

這是一個脆弱的解決方案,所以我建議堅持數據框上的操作。例如。

baz = 2*df['qux'].sum() + 3*df['bar'].sum() 
+0

這不保留原始數據類型;所有列都轉換爲對象(字符串的外觀)。 – Daniel

+0

對不起,你是對的,我沒有用一列字符串檢查它。現在更新。 – horatio

+0

這幾乎是正確的。唯一的問題是數據類型沒有完全保留;整數轉換爲浮點數。幸運的是,我認爲這對我來說不是問題。如果今天沒有人提供替代方案,我會接受此解決方案。 – Daniel

3

替代方式(驗證了大熊貓0.18.1):

import numpy as np 
total = df.apply(np.sum) 
total['foo'] = 'tot' 
df.append(pd.DataFrame(total.values, index=total.keys()).T, ignore_index=True) 

結果:

foo bar qux 
0 a  1 3.14 
1 b  3 2.72 
2 c  2 1.62 
3 d  9 1.41 
4 e  3 0.58 
5 tot 18 9.47 
0

繼幫助對我來說,一列總和行總添加到數據幀。

假設dft1是您的原始數據框...現在通過以下步驟添加列總數和行總數。

from io import StringIO 
import pandas as pd 

#create dataframe string 
dfstr = StringIO(u""" 
a;b;c 
1;1;1 
2;2;2 
3;3;3 
4;4;4 
5;5;5 
""") 

#create dataframe dft1 from string 
dft1 = pd.read_csv(dfstr, sep=";") 

## add a column total to dft1 
dft1['Total'] = dft1.sum(axis=1) 

## add a row total to dft1 with the following steps 

sum_row = dft1.sum(axis=0) #get sum_row first 
dft1_sum=pd.DataFrame(data=sum_row).T #change it to a dataframe 

dft1_sum=dft1_sum.reindex(columns=dft1.columns) #line up the col index to dft1 
dft1_sum.index = ['row_total'] #change row index to row_total 

dft1.append(dft1_sum) # append the row to dft1