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
可以删除,因为数据不能汇总。
输出应该是这样的。我有兴趣在结果数据框中同时包含 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()
然而只有 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()
这应该很简单,但不知何故我找不到可行的解决方案。
我有一个 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
可以删除,因为数据不能汇总。
输出应该是这样的。我有兴趣在结果数据框中同时包含 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()
然而只有 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()