【发布时间】:2018-07-06 09:36:53
【问题描述】:
我在使用带有分类数据的 pandas groupby 时遇到问题。从理论上讲,它应该非常高效:您通过整数而不是字符串进行分组和索引。但它坚持认为,当按多个类别进行分组时,每个类别组合都必须考虑在内。
即使常见字符串的密度较低,我有时也会使用类别,这仅仅是因为这些字符串很长并且可以节省内存/提高性能。有时每列中有数千个类别。当按 3 列分组时,pandas 强制我们保存 1000^3 组的结果。
我的问题:有没有一种方便的方法可以将groupby 与类别一起使用,同时避免这种不良行为?我不是在寻找这些解决方案中的任何一个:
- 通过
numpy重新创建所有功能。 - 在
groupby之前不断转换为字符串/代码,稍后恢复为类别。 - 从组列创建元组列,然后按元组列分组。
我希望有一种方法可以修改这个特定的pandas 特质。下面是一个简单的例子。我最终得到了 12 个,而不是我想要的 4 个输出类别。
import pandas as pd
group_cols = ['Group1', 'Group2', 'Group3']
df = pd.DataFrame([['A', 'B', 'C', 54.34],
['A', 'B', 'D', 61.34],
['B', 'A', 'C', 514.5],
['B', 'A', 'A', 765.4],
['A', 'B', 'D', 765.4]],
columns=(group_cols+['Value']))
for col in group_cols:
df[col] = df[col].astype('category')
df.groupby(group_cols, as_index=False).sum()
Group1 Group2 Group3 Value
# A A A NaN
# A A C NaN
# A A D NaN
# A B A NaN
# A B C 54.34
# A B D 826.74
# B A A 765.40
# B A C 514.50
# B A D NaN
# B B A NaN
# B B C NaN
# B B D NaN
赏金更新
pandas 开发团队未能很好地解决这个问题(参见 github.com/pandas-dev/pandas/issues/17594)。因此,我正在寻找解决以下任何问题的回复:
- 为什么参考 pandas 源代码,分类数据在 groupby 操作中的处理方式不同?
- 为什么首选当前实现?我很欣赏这是主观的,但我正在努力寻找这个问题的任何答案。当前的行为在许多情况下是令人望而却步的,没有繁琐且可能代价高昂的变通办法。
- 是否有一个干净的解决方案来覆盖 pandas 在 groupby 操作中对分类数据的处理?请注意 3 条禁止路线(下拉到 numpy;与代码之间的转换;按元组列创建和分组)。我更喜欢“符合熊猫标准”的解决方案,以尽量减少/避免丢失其他熊猫分类功能。
- pandas 开发团队支持和阐明现有治疗方法的回应。另外,为什么要考虑所有类别组合都不能配置为布尔参数?
赏金更新 #2
需要明确的是,我并不期望上述 4 个问题都能得到答案。我要问的主要问题是是否可以或可取地覆盖pandas 库方法,以便以促进groupby / set_index 操作的方式处理类别。
【问题讨论】:
-
Here 是 Jeff 回答的一个问题,但我无法遵循他的逻辑。
-
@ayhan,我也不遵循他的逻辑。我认为在
groupby中有一个参数来指定我们是否要计算所有类别组合并不是一项困难的编程任务。 -
甚至 df.set_index(group_cols).sum(level=[0,1,2]) 返回相同的..
-
@jp_data_analysis 我认为我们需要一个像
ignore_missing=Boolean这样的参数来用于 groupby 中缺少的类别组合。将来有人可能会添加它。让我们尝试在 github 中请求功能请求 -
@Dark,有人(有效地)问过,但很快就被驳回了:github.com/pandas-dev/pandas/issues/17594
标签: python pandas numpy group-by pandas-groupby