Python 跨多个列聚合

Python 跨多个列聚合,python,pandas-groupby,Python,Pandas Groupby,我有以下数据帧 import pandas as pd import numpy as np from IPython.display import display arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] index = pd.MultiIndex.from_arra

我有以下数据帧

import pandas as pd
import numpy as np
from IPython.display import display

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
         ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'A': np.arange(8),
                   'B': np.arange(8),
                    'C': np.arange(8)},
                  index=index)
df
我现在想要一个dataframe,其内容是组“first”下所有元素的总和,即

表,th,td{ 边框:1px纯黑; } 第一 总和 酒吧 3. 巴兹 15 福 27 库克斯 39 方式1

此代码

grouped = df.reset_index().groupby('first').sum()
sum_by_columns = grouped.sum(axis=1).to_frame()
sum_by_columns.columns = ['sum']
print(sum_by_columns)
将提供您想要的输出

       sum
first     
bar      3
baz     15
foo     27
qux     39
这里的意思是grouped.sum分别应用于每一列

方式2

不过,您可以使用自己的聚合功能:

sum_by_columns = df.groupby([pd.Grouper(level='first')]).apply(lambda x: x.sum().sum())
sum_by_columns.columns = ['sum']
print(sum_by_columns)
这会让你得到同样的结果。这里,lambda不是应用于每个列,而是应用于每个部分数据帧

方式3

如果需要跨列聚合,可以首先使用df.stack方法将它们转换为行:


@sharatpc试过了,但还是犯了同样的错误。我使用的是熊猫0.18.0。您使用的是更高版本吗?我使用的是0.21.0。很抱歉删除注释,但可以使用已实现的列代替1。但我确实得到了第一级的op:bar 1 1 1 baz 5 5 5 foo 9 9 qux 13 13这正是我想要的。谢谢您知道如何在一个步骤中使用其他聚合函数扩展groupby吗?如果我需要求和和和平均值?@andrnev,您可以使用函数列表甚至dict,并将它们传递给groupby.aggregate方法,请参见hmm.trusted printdf.groupby[pd.Grouperlevel='first'].agg[np.sum,np.mean,np.std]和printdf.groupby[pd.Grouperlevel='first'].aggregatenp.sum,np.mean,np.std和两者似乎都不会在索引级别生成聚合。如果要在所有列中聚合多个统计信息,最简单的方法是首先将它们转换为一列:df.stack.groupbypd.Grouperlevel='first'.agg[np.sum,np.mean,np.std]
sum_by_columns = df.stack().groupby(pd.Grouper(level='first')).sum().to_frame()
sum_by_columns.columns = ['sum']
print(sum_by_columns)
 df.groupby(by="first").sum() will give you, (by="w/e you want them to be group by")
            A   B   C
    first            
    bar     1   1   1
    baz     5   5   5
    foo     9   9   9
    qux    13  13  13

 df.groupby(by="first").sum().sum(axis=1) will give you 
first
bar     3
baz    15
foo    27
qux    39