我有一个数据框,如:
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
命令,但我最终得到了一个系列,虽然我可以转换回Dataframe,但不维护数据类型:
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']
答案 0 :(得分:30)
使用
附加总计行df.append(df.sum(numeric_only=True), ignore_index=True)
只有在您拥有一列字符串或对象时才需要进行转换。
这是一个脆弱的解决方案,所以我建议坚持使用数据帧。例如
baz = 2*df['qux'].sum() + 3*df['bar'].sum()
答案 1 :(得分:6)
将DataFrame.pivot_table
与margins=True
:
import pandas as pd
data = [('a',1,3.14),('b',3,2.72),('c',2,1.62),('d',9,1.41),('e',3,.58)]
df = pd.DataFrame(data, columns=('foo', 'bar', 'qux'))
原始df
:
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
由于pivot_table
需要某种分组(没有index
参数,它会引发ValueError: No group keys passed!
),而您的原始索引是空的,我们将使用{{ 1}}列:
foo
瞧!
df.pivot_table(index='foo',
margins=True,
margins_name='total', # defaults to 'All'
aggfunc=sum)
答案 2 :(得分:6)
替代方式(在Pandas 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
答案 3 :(得分:6)
df.loc["Total"] = df.sum()
为我工作,我发现它更容易记住。我想念什么吗? 可能在早期版本中是不可能的。
我实际上只是想暂时添加总行。 永久添加它可以很好地显示,但使以后的计算变得麻烦。
刚刚发现
df.append(df.sum().rename('Total'))
这将在Jupyter笔记本中打印出我想要的内容,并且看起来不影响df本身。
答案 4 :(得分:3)
以下有助于我向数据框添加列总计和行总数。
假设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
答案 5 :(得分:2)
这是我的方法,通过转置并结合使用lambda函数使用assign方法。这对我来说很简单。
df.T.assign(GrandTotal = lambda x: x.sum(axis=1)).T
答案 6 :(得分:1)
基于JMZ答案
df.append(df.sum(numeric_only=True), ignore_index=True)
如果要继续使用当前索引,可以使用.rename()命名和系列,如下所示:
df.append(df.sum().rename('Total'))
这将在表格底部添加一行。
答案 7 :(得分:0)
基于Matthias Kauer的回答。
要添加总计:
df.loc["Row_Total"] = df.sum()
要添加总计列,
df.loc[:,"Column_Total"] = df.sum(axis=1)
答案 8 :(得分:0)
这给出了行和列的总计
import numpy as np
import pandas as pd
df = pd.DataFrame({'a': [10,20],'b':[100,200],'c': ['a','b']})
df.loc['Column_Total']= df.sum(numeric_only=True, axis=0)
df.loc[:,'Row_Total'] = df.sum(numeric_only=True, axis=1)
print(df)
a b c Row_Total
0 10.0 100.0 a 110.0
1 20.0 200.0 b 220.0
Column_Total 30.0 300.0 NaN 330.0