3 回答

TA贡献1864条经验 获得超2个赞
或者分两步,.sum()按照您的建议使用该函数(这也可能更具可读性):
import pandas as pd
df = pd.DataFrame( {"Undergraduate": {"Straight A's": 240, "Not": 3_760},"Graduate": {"Straight A's": 60, "Not": 440},})
#Total sum per column:
df.loc['Total',:]= df.sum(axis=0)
#Total sum per row:
df.loc[:,'Total'] = df.sum(axis=1)
输出:
Graduate Undergraduate Total
Not 440 3760 4200
Straight A's 60 240 300
Total 500 4000 4500

TA贡献1833条经验 获得超4个赞
append 和 assign
这个答案的重点是提供在线而不是就地解决方案。
append
我append用来堆叠 aSeries或DataFrame垂直。它还创建了一个,copy以便我可以继续链接。
assign
我assign用来添加一列。然而,DataFrame我正在研究的是在下界空间之间。所以我lambda在assign参数中使用 a告诉Pandas将它应用到调用DataFrame.
df.append(df.sum().rename('Total')).assign(Total=lambda d: d.sum(1))
Graduate Undergraduate Total
Not 440 3760 4200
Straight A's 60 240 300
Total 500 4000 4500
有趣的替代品
使用dropwitherrors='ignore'摆脱潜在的预先存在的Total行和列。
而且,还在排队。
def tc(d):
return d.assign(Total=d.drop('Total', errors='ignore', axis=1).sum(1))
df.pipe(tc).T.pipe(tc).T
Graduate Undergraduate Total
Not 440 3760 4200
Straight A's 60 240 300
Total 500 4000 4500

TA贡献1773条经验 获得超3个赞
从使用的原始数据crosstab,如果只是基于您的输入,您只需要melt之前crosstab
s=df.reset_index().melt('index')
pd.crosstab(index=s['index'],columns=s.variable,values=s.value,aggfunc='sum',margins=True)
Out[33]:
variable Graduate Undergraduate All
index
Not 440 3760 4200
Straight A's 60 240 300
All 500 4000 4500
玩具数据
df=pd.DataFrame({'c1':[1,2,2,3,4],'c2':[2,2,3,3,3],'c3':[1,2,3,4,5]})
# before `agg`, I think your input is the result after `groupby`
df
Out[37]:
c1 c2 c3
0 1 2 1
1 2 2 2
2 2 3 3
3 3 3 4
4 4 3 5
pd.crosstab(df.c1,df.c2,df.c3,aggfunc='sum',margins
=True)
Out[38]:
c2 2 3 All
c1
1 1.0 NaN 1
2 2.0 3.0 5
3 NaN 4.0 4
4 NaN 5.0 5
All 3.0 12.0 15
添加回答
举报