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
可以删除,因为无法聚合数据。
这是输出的样子。我有兴趣在结果数据框中同时拥有col3
和col4
。 col1
和 col2
是否是索引的一部分并不重要。
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 合并