【问题标题】:使用不同的函数将 DataFrame 聚合到一行
【发布时间】: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


【解决方案1】:

使用Series.to_frame + DataFrame.Ttranspose 的缩写):

dfa = df.agg(aggfns).to_frame().T

输出:

>>> dfa
     A    B
0  3.0  2.5

【讨论】:

  • 这会丢失列的 dtype,如问题中所述:传递一个系列会以一种不幸的方式将所有类型压缩为单个 dtype(如,取决于最具体的常见类型所有列)。在生成的框架列中,A 的类型为 float64,但它应该是 int64
  • @BeeOnRope 检查其他答案。
【解决方案2】:

您可以按空系列进行分组,而不是创建新列:

dfa = df.assign(d=0).groupby('d').agg(aggfns).reset_index(drop=True)

输出:

>>> dfa
   A    B
0  3  2.5

【讨论】:

    【解决方案3】:

    您可以显式创建一个新的DataFrame()

    >>> pd.DataFrame({'A': [df.A.sum()], 'B': [df.B.mean()]}
       A    B
    0  3  2.5
    

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      相关资源
      最近更新 更多