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