Pandas - dataframe groupby - 如何获取多列的总和

Pandas - dataframe groupby - how to get sum of multiple columns

这应该很简单,但不知何故我找不到可行的解决方案。

我有一个 pandas 数据框,如下所示:

index col1   col2   col3   col4   col5
0     a      c      1      2      f 
1     a      c      1      2      f
2     a      d      1      2      f
3     b      d      1      2      g
4     b      e      1      2      g
5     b      e      1      2      g

我想按col1和col2分组,得到col3和col4的sum() col5可以删除,因为数据不能汇总。

输出应该是这样的。我有兴趣在结果数据框中同时包含 col3col4col1col2 是否是索引的一部分并不重要。

index col1   col2   col3   col4   
0     a      c      2      4          
1     a      d      1      2      
2     b      d      1      2      
3     b      e      2      4      
  

这是我尝试过的:

df_new = df.groupby(['col1', 'col2'])['col3', 'col4'].sum()

然而只有 returns col4 的汇总结果。

我在这里迷路了。我找到的每个例子都只聚合了一列,显然不会出现问题。

通过使用apply

df.groupby(['col1', 'col2'])["col3", "col4"].apply(lambda x : x.astype(int).sum())
Out[1257]: 
           col3  col4
col1 col2            
a    c        2     4
     d        1     2
b    d        1     2
     e        2     4

如果你想agg

df.groupby(['col1', 'col2']).agg({'col3':'sum','col4':'sum'})

问题很可能是 df.col3.dtype 可能不是 int 或数字数据类型。在 groupby

之前尝试 df.col3 = df.col3.astype(int)

此外,select 您在 groupby 之后的列,以查看这些列是否被聚合:

df_new = df.groupby(['col1', 'col2']).sum()[["col3", "col4"]]

以上答案对我不起作用。

df_new = df.groupby(['col1', 'col2']).sum()[["col3", "col4"]]

我按单列分组并求和列。

这是对我有用的那个。

D1.groupby(['col1'])['col2'].sum() << The sum at the end not the middle.

另一种通用解决方案是

df.groupby(['col1','col2']).agg({'col3':'sum','col4':'sum'}).reset_index()

这将为您提供所需的输出。

更新(2020 年 6 月): 在 Pandas 0.25.0 中引入,Pandas 添加了新的 groupby 行为 “named aggregation”tuples,用于命名将多个聚合函数应用于特定列时的输出列。

df.groupby(['col1','col2']).agg(
     sum_col3 = ('col3','sum'),
     sum_col4 = ('col4','sum'),
     ).reset_index()

此外,您可以命名新列,例如我使用了 'sum_col3' 和 'sum_col4',但您可以使用任何您想要的名称。

详见Link

我认为执行以下操作会更有效率:

df.groupby(['col1', 'col2']).agg({'col3':'sum','col4':'sum'}).sum(axis=1)

或:

df.groupby(['col1', 'col2'])['col3', 'col4'].sum().sum(axis=1)

这确实假设您在数据框中有适当的类型。

由于 pandas FutureWarning: Indexing with multiple keys discussed on GitHub and ,我推荐这个解决方案:

df.groupby(['col1', 'col2'])[['col3', 'col4']].sum().reset_index()

输出:

您在 DataFrameGroupBy 对象中缺少 select 必要列的一对方括号:

df.groupby(['col1', 'col2'])[['col3', 'col4']].sum()

您也可以删除之前不需要的列 groupby:

df.drop('col5', axis=1).groupby(['col1', 'col2']).sum()