gpt4 book ai didi

python - 具有冗余 nan 类别的 Pandas groupby

转载 作者:IT老高 更新时间:2023-10-28 21:12:23 25 4
gpt4 key购买 nike

我在使用 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)。因此,我正在寻找解决以下任何问题的回复:

  1. 为什么引用 pandas 源代码,分类数据在 groupby 操作中的处理方式不同?
  2. 为什么首选当前的实现方式?我很欣赏这是主观的,但我正在努力寻找这个问题的任何答案。当前的行为在许多情况下是令人望而却步的,没有繁琐且可能代价高昂的解决方法。
  3. 是否有一个干净的解决方案来覆盖 pandas 在 groupby 操作中对分类数据的处理?请注意 3 条禁止路线(下拉到 numpy;与代码之间的转换;按元组列创建和分组)。我更喜欢“符合 pandas”的解决方案,以尽量减少/避免丢失其他 pandas 分类功能。
  4. 来自 Pandas 开发团队的回应,旨在支持和阐明现有的治疗方法。另外,为什么要考虑所有类别组合都不能配置为 bool 参数?

赏金更新 #2

需要明确的是,我并不期望上述 4 个问题都能得到答案。我要问的主要问题是覆盖 pandas 库方法是否可能或可取,以便以促进 groupby/set_index 操作。

最佳答案

自 Pandas 0.23.0 以来,groupby method现在可以采用参数 observed 来解决这个问题,如果它设置为 True(默认为 False)。以下是与问题完全相同的代码,仅添加了 observed=True :

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, observed=True).sum()

enter image description here

关于python - 具有冗余 nan 类别的 Pandas groupby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48471648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com