GroupBy 两列,第一级边距

我将数据框按 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         D

A   B                        

bar one    0.400157  0.410599

    three  2.240893  1.454274

    two   -0.977278  0.121675

foo one    2.714141  0.340644

    three -0.151357  0.333674

    two    2.846296  0.905081

我要得到什么:


                  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

怎么做?


更新:我在Pandas groupby 和 sum total of group 上发现了一个类似的问题,这个问题还有 2 个答案。


白猪掌柜的
浏览 190回答 1
1回答

宝慕林4294392

您可以巧妙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().valuesprint(v)                  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如果您需要聚合不同的指标: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().valuesprint(v)                  C               D                      sum count       sum countfoo 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.0bar 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    DA   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.0foo 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.0All        7.072852  3.565947   8.0  8.0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python