为了账号安全,请及时绑定邮箱和手机立即绑定

GroupBy 两列,第一级边距

GroupBy 两列,第一级边距

白猪掌柜的 2021-09-14 13:43:36
我将数据框按 2 列分组,并按其他列的总和进行聚合。如何通过同一数据框中的第一个分组列获得总计?例如我的数据框是:np.random.seed(0)df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],               'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],               'C' : np.random.randn(8),               'D' : np.random.randn(8)})的结果:grouped = df.groupby(by=['A', 'B']).sum()是:                  C         DA   B                        bar one    0.400157  0.410599    three  2.240893  1.454274    two   -0.977278  0.121675foo one    2.714141  0.340644    three -0.151357  0.333674    two    2.846296  0.905081我要得到什么:                  C         DA   B                        bar one    0.400157  0.410599    two   -0.977278  0.121675    three  2.240893  1.454274    total  1.663773  1.986547foo one    2.714141  0.340644    two    2.846296  0.905081    three -0.151357  0.333674    total  5.409080  1.579400怎么做?更新:我在Pandas groupby 和 sum total of group 上发现了一个类似的问题,这个问题还有 2 个答案。
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

您可以巧妙pd.Categorical地在groupby输出中为“总计”创建一个占位符。这将使计算和将总数分配回结果变得容易。


df.B = pd.Categorical(

         df.B, categories=np.append(df.B.unique(), 'total'))

v = df.groupby(by=['A', 'B']).sum()

v.loc(axis=0)[pd.IndexSlice[:,'total']] = v.groupby(level=0).sum().values

print(v)

                  C         D

A   B                        

bar one    0.400157  0.410599

    two   -0.977278  0.121675

    three  2.240893  1.454274

    total  1.663773  1.986547

foo one    2.714141  0.340644

    two    2.846296  0.905081

    three -0.151357  0.333674

    total  5.409080  1.579400

如果您需要聚合不同的指标:


df.B = pd.Categorical(

         df.B, categories=np.append(df.B.unique(), 'total'))

idx = pd.MultiIndex.from_product([df.A.unique(), df.B.cat.categories]) 


v = df.groupby(by=['A', 'B']).agg(['sum', 'count']).reindex(idx)

v.loc(axis=0)[pd.IndexSlice[:,'total']] = v.groupby(level=0, sort=False).sum().values

print(v)

                  C               D      

                sum count       sum count

foo one    2.714141   2.0  0.340644   2.0

    two    2.846296   2.0  0.905081   2.0

    three -0.151357   1.0  0.333674   1.0

    total  5.409080   5.0  1.579400   5.0

bar one    0.400157   1.0  0.410599   1.0

    two   -0.977278   1.0  0.121675   1.0

    three  2.240893   1.0  1.454274   1.0

    total  1.663773   3.0  1.986547   3.0

另一种选择是pivot_table使保证金生成更容易(尽管不提供子级保证金):


df.pivot_table(index=['A', 'B'], 

               values=['C', 'D'], 

               aggfunc=['sum', 'count'], 

               margins=True)


                sum           count     

                  C         D     C    D

A   B                                   

bar one    0.400157  0.410599   1.0  1.0

    two   -0.977278  0.121675   1.0  1.0

    three  2.240893  1.454274   1.0  1.0

foo one    2.714141  0.340644   2.0  2.0

    two    2.846296  0.905081   2.0  2.0

    three -0.151357  0.333674   1.0  1.0

All        7.072852  3.565947   8.0  8.0


查看完整回答
反对 回复 2021-09-14
  • 1 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号