繁体   English   中英

熊猫 groupby 没有将按列分组转换为索引

[英]pandas groupby without turning grouped by column into index

pandas groupby 的默认行为是将 group by 列转换为索引,并将它们从数据框的列列表中删除。 例如,假设我有一个包含这些列的数据框

col1|col2|col3|col4

如果我以这种方式应用 groupby 列col2col3

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

数据框df在列列表中不再具有['col2','col3'] 它们会自动变成结果数据帧的索引。

我的问题是如何在列上执行 groupby 并将该列保留在数据框中?

df.groupby(['col2','col3'], as_index=False).sum()

另一种方法是:

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

添加了以下稍微详细的答案以帮助那些仍然对使用哪种答案变体感到困惑的人。

首先,针对此问题提出的两种解决方案是:

  • 解决方案1df.groupby(['A', 'B'], as_index=False).sum()
  • 解决方案2df.groupby(['A', 'B']).sum().reset_index()

两者都给出了预期的结果。


解决方案1:

如文档中所述, 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 列的位置。


解决方案2:

要理解第二种解决方案,让我们看一下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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM