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

Posted

技术标签:

【中文标题】Pandas - dataframe groupby - 如何获得多列的总和【英文标题】:Pandas - dataframe groupby - how to get sum of multiple columns 【发布时间】:2018-03-07 23:02:27 【问题描述】:

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

我有一个看起来像这样的熊猫数据框:

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()

然而,这只会返回 col4 的聚合结果。

我在这里迷路了。我发现的每个示例都只聚合一列,显然没有出现问题。

【问题讨论】:

问题可能是df.col3.dtype 可能不是int 或数字数据类型。尝试df.col3 = df.col3.astype(int),然后再执行groupby 【参考方案1】:

另一个通用解决方案是

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

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

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

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

此外,您可以命名新列,例如我用过“sum_col3”和“sum_col4”,但你可以使用任何你想要的名字。

详细说明请参考Link。

【讨论】:

【参考方案2】:

由于 pandas FutureWarning: Indexing with multiple keys 在GitHub 和Stack Overflow 上讨论过,我推荐这个解决方案:

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

输出:

【讨论】:

【参考方案3】:

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

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

或:

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

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

【讨论】:

【参考方案4】:

上面的答案对我不起作用。

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

我按单个 group by 和 sum 列分组。

这是为我工作的那个。

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

【讨论】:

你试过 :df_new = df.groupby(['col1', 'col2'])[["col3", "col4"]].sum() 吗?这个对我有用。【参考方案5】:

通过使用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')

【讨论】:

【参考方案6】:

问题可能是df.col3.dtype 可能不是int 或数字数据类型。尝试df.col3 = df.col3.astype(int),然后再执行groupby

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

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

【讨论】:

以上是关于Pandas - dataframe groupby - 如何获得多列的总和的主要内容,如果未能解决你的问题,请参考以下文章

pandas中dataframe索引排序实战:pandas中dataframe索引降序排序pandas中dataframe索引升序排序

pandas构建复合索引数据(multiple index dataframe)pandas索引复合索引dataframe数据

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

将 Pandas Multiindexed DataFrame 与 Singleindexed Pandas DataFrame 合并

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

python pandas dataframe 写入hdfs