[英]pandas groupby without turning grouped by column into index
pandas groupby 的默认行为是将 group by 列转换为索引,并将它们从数据框的列列表中删除。 例如,假设我有一个包含这些列的数据框
col1|col2|col3|col4
如果我以这种方式应用 groupby 列col2
和col3
df.groupby(['col2','col3']).sum()
数据框df
在列列表中不再具有['col2','col3']
。 它们会自动变成结果数据帧的索引。
我的问题是如何在列上执行 groupby 并将该列保留在数据框中?
df.groupby(['col2','col3'], as_index=False).sum()
另一种方法是:
df.groupby(['col2', 'col3']).sum().reset_index()
添加了以下稍微详细的答案以帮助那些仍然对使用哪种答案变体感到困惑的人。
首先,针对此问题提出的两种解决方案是:
df.groupby(['A', 'B'], as_index=False).sum()
df.groupby(['A', 'B']).sum().reset_index()
两者都给出了预期的结果。
如文档中所述, as_index
将要求SQL 样式的分组输出,这将有效地要求 pandas 在输出中保留这些按列分组的输出。
as_index : bool,默认为 True
对于聚合输出,返回以组标签为索引的对象。 仅与 DataFrame 输入相关。 as_index=False 实际上是“SQL 风格”的分组输出。
例子:
给定以下数据框:
A B C D
0 A 1 0.502130 0.959404
1 A 3 0.335416 0.087215
2 B 2 0.067308 0.084595
3 B 4 0.454158 0.723124
4 B 4 0.323326 0.895858
5 C 2 0.672375 0.356736
6 C 5 0.929655 0.371913
7 D 5 0.212634 0.540736
8 D 5 0.471418 0.268270
9 E 1 0.061270 0.739610
应用第一个解决方案给出:
>>> df.groupby(["A", "B"], as_index=False).sum()
A B C D
0 A 1 0.502130 0.959404
1 A 3 0.335416 0.087215
2 B 2 0.067308 0.084595
3 B 4 0.777483 1.618982
4 C 2 0.672375 0.356736
5 C 5 0.929655 0.371913
6 D 5 0.684052 0.809006
7 E 1 0.061270 0.739610
正确保留 groupby 列的位置。
要理解第二种解决方案,让我们看一下as_index = True
上一个命令的输出,这是pandas.DataFrame.groupby
的默认行为(查看文档):
>>> df.groupby(["A", "B"], as_index=True).sum()
C D
A B
A 1 0.502130 0.959404
3 0.335416 0.087215
B 2 0.067308 0.084595
4 0.777483 1.618982
C 2 0.672375 0.356736
5 0.929655 0.371913
D 5 0.684052 0.809006
E 1 0.061270 0.739610
如您所见,groupby 键成为数据帧的索引。 使用pandas.DataFrame.reset_index
(查看文档),我们可以将数据帧的索引作为列放回并使用默认索引。 这也使我们得到与上一步相同的结果:
>>> df.groupby(['A', 'B']).sum().reset_index()
A B C D
0 A 1 0.502130 0.959404
1 A 3 0.335416 0.087215
2 B 2 0.067308 0.084595
3 B 4 0.777483 1.618982
4 C 2 0.672375 0.356736
5 C 5 0.929655 0.371913
6 D 5 0.684052 0.809006
7 E 1 0.061270 0.739610
请注意,由于第一个解决方案在 1 步中实现了要求,而在第二个解决方案中实现了 2 个步骤,因此前者稍微快一些:
%timeit df.groupby(["A", "B"], as_index=False).sum()
3.38 ms ± 21.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df.groupby(["A", "B"]).sum().reset_index()
3.9 ms ± 365 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
不确定,但我认为正确的答案是
df.groupby(['col2','col3']).sum()
df = df.reset_index()
至少我一直在做的是避免使用多索引的数据帧。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.