【发布时间】:2022-01-23 05:01:14
【问题描述】:
我有一个包含多行的数据框,我想将每列向下聚合为 1 行数据框,每列使用不同的函数。
以如下数据框为例:
df = pd.DataFrame([[1,2], [2,3]], columns=['A', 'B'])
print(df)
结果:
A B
0 1 2
1 2 3
我想使用sum 聚合第一列,使用mean 聚合第二列。有一个方便的DataFrame.agg() 方法可以将列名映射到聚合函数,如下所示:
aggfns = {
'A': 'sum',
'B': 'mean'
}
print(df.agg(aggfns))
但是,这会导致 Series 而不是 DataFrame:
A 3.0
B 2.5
dtype: float64
除其他问题外,一个系列只有一个 dtype,因此会丢失每列的数据类型。系列非常适合表示单个数据框列,但不能表示单个数据框行。
我设法想出了这个折磨人的咒语:
df['dummy'] = 0
dfa = df.groupby('dummy').agg(aggfns).reset_index(drop=True)
print(dfa)
这会创建一个到处都是 0 的虚拟列,对其进行分组,进行聚合并删除它,从而产生所需的结果:
A B
0 3 2.5
肯定有更好的吗?
【问题讨论】:
-
如果将 agg 函数放在字典中的括号中会发生什么?或者如果您使用了命名聚合?
-
@sammywemmy - 我也尝试过像
{ 'A' : ['sum'] ...这样的“一个列表”方法,但是如果总共有 N 个不同的聚合函数(在我的示例中为 2 个),这会产生 N 行结果:每个函数占一行,在该函数不适用的大多数单元格中缺少 NaN 或其他内容。什么是“命名聚合”? -
您介意添加您的预期输出吗?
-
df.agg(A=('A', 'sum'), B=('B', 'mean'))是一个命名聚合,但它产生相同的结果。 @KarlThornton 的解决方案似乎是你所追求的 -
@rpanai 我已经添加了上一个变体的输出,这是所需的输出。
标签: python pandas dataframe group-by aggregation