groupby 在有序分类列上的奇怪行为

Posted

技术标签:

【中文标题】groupby 在有序分类列上的奇怪行为【英文标题】:Weird behaviour with groupby on ordered categorical columns 【发布时间】:2018-11-19 14:02:15 【问题描述】:

MCVE

df = pd.DataFrame(
    'Cat': ['SF', 'W', 'F', 'R64', 'SF', 'F'], 
    'ID': [1, 1, 1, 2, 2, 2]
)

df.Cat = pd.Categorical(
    df.Cat, categories=['R64', 'SF', 'F', 'W'], ordered=True)

如您所见,我在Cat 上定义了一个有序分类列。要验证,请检查;

0     SF
1      W
2      F
3    R64
4     SF
5      F
Name: Cat, dtype: category
Categories (4, object): [R64 < SF < F < W]

我想找到最大的类别 PER ID。执行groupby + max 有效。

df.groupby('ID').Cat.max()

ID
1    W
2    F
Name: Cat, dtype: object

但我不希望 ID 成为索引,所以我指定as_index=False

df.groupby('ID', as_index=False).Cat.max()

   ID Cat
0   1   W
1   2  SF

哎呀!现在,最大值是按字典顺序。谁能解释这是否是预期的行为?或者这是一个错误?

注意,对于这个问题,解决方法是df.groupby('ID').Cat.max().reset_index()

注意,

>>> pd.__version__
'0.22.0'

【问题讨论】:

注意,在 v0.23.0 中,这也有效:df.groupby("ID", as_index=False).Cat.apply(max) from - pandas.pydata.org/pandas-docs/stable/groupby.html 在有多个键的情况下,默认情况下结果是 MultiIndex,但可以使用 as_index 选项更改。由于 df 是使用两个列表创建的,as_index = False,启用列表索引,其比较是按字典顺序排列的? 所以您是说orderer Categorical 变量丢失并在创建Multiindex 时被视为字符串?听起来像是熊猫的一个很好的错误报告。 github. @smci 我想,但我太懒了... 怎么样:df.groupby('ID', as_index=False).max()?它似乎给出了一个很好的结果。 【参考方案1】:

这不是预期的行为,这是一个错误。

Source diving 表明该标志做了两个完全不同的事情。一个简单地忽略了分组级别和名称,它只采用具有新范围索引的值。另一个显然保留了它们。

【讨论】:

以上是关于groupby 在有序分类列上的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

最近 n_days 使用 groupby 在特定列上的累积总和

在 SQL 中,有序查询中的 groupby 行为是不是与在同一查询中执行相同?

Pandas Groupby:同一列上的聚合,但总计基于两个不同的标准/数据框

性能调优8:分组聚合 - group by

Pandas Multiindex 和 Groupby 返回奇怪的行为

RedShift GROUP BY 常量列给出不一致的结果