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:同一列上的聚合,但总计基于两个不同的标准/数据框