为啥熊猫分组聚合丢弃分类列?

Posted

技术标签:

【中文标题】为啥熊猫分组聚合丢弃分类列?【英文标题】:Why does pandas grouping-aggregation discard categoricals column?为什么熊猫分组聚合丢弃分类列? 【发布时间】:2019-02-01 07:04:13 【问题描述】:

情况

考虑以下两个数据框:

import pandas as pd  # version 0.23.4

df1 = pd.DataFrame(
    'A': [1, 1, 1, 2, 2],
    'B': [100, 100, 200, 100, 100],
    'C': ['apple', 'orange', 'mango', 'mango', 'orange'],
    'D': ['jupiter', 'mercury', 'mars', 'venus', 'venus'],
)

df2 = df1.astype('D': 'category')

正如您在数据框 df2 中看到的那样,D 列的数据类型为 categoricals,但除此之外,df2df1 相同。

现在考虑以下分组聚合操作:

result_x_df1 = df1.groupby(by='A').first()
result_x_df2 = df2.groupby(by='A').first()
result_y_df1 = df1.groupby(by=['A', 'B']).first()
result_y_df2 = df2.groupby(by=['A', 'B']).first()

结果如下:

In [1]: result_x_df1
Out[1]:
     B      C        D
A
1  100  apple  jupiter
2  100  mango    venus

In [2]: result_x_df2
Out[2]:
     B      C        D
A
1  100  apple  jupiter
2  100  mango    venus

In [3]: result_y_df1
Out[3]:
           C        D
A B
1 100  apple  jupiter
  200  mango     mars
2 100  mango    venus

In [4]: result_y_df2
Out[4]:
           C
A B
1 100  apple
  200  mango
2 100  mango

问题

result_x_df1result_x_df2result_y_df1 看起来完全符合我的预期。然而,真正让我感到困惑的是,在result_y_df2 中,categoricals 列D 已被完全丢弃。这就提出了以下问题:

为什么result_y_df2 中的分类列D 被丢弃? 如何防止分类列D 被丢弃,即如何从df2 获得类似于result_y_df1 的分组聚合结果?

【问题讨论】:

.head(1) 可能会有所帮助,但仍然很好奇为什么 first 会丢弃分类列 @Dark 使用head(1) 而不是first() 似乎确实可以解决问题! Pandas 0.21.0 版给出了预期的结果。更新的版本一定改变了一些东西。 @RaunaqJain 很有趣。我想知道与pandas 0.21.0 相比的行为变化是错误还是故意修改? 我很想调试它。可悲的是,我不知道如何去做。如果有人可以指导我完成,我将不胜感激。学习的好机会。 【参考方案1】:

问题的原因似乎是 pandas 中的回归错误(从版本 0.23.0 开始出现)。一种解决方法是使用 head(1) 而不是 first()(如 Dark 所建议的那样)。

请参阅this pandas github issue 了解新进展。

【讨论】:

以上是关于为啥熊猫分组聚合丢弃分类列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中对没有聚合功能的列进行分组?

使用转换的熊猫分组列表聚合失败并出现键错误

在熊猫中按多个条件分组[重复]

在使用条件聚合进行分组时选择多个第 n 个值 - 熊猫

R - 对连续变量标题进行分组,将分类变量因子作为行并聚合为最小值、最大值、平均值

熊猫将行值除以聚合总和,条件由其他单元格设置