pandas.groupby通过使用lambda aggfunc和categorical type与obj对同一数据做出不同的反应

2024-06-17 15:55:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了pandas.groupby的一些奇怪行为。根据数据列的数据类型,我得到两种完全不同的结果。其中一个和预期的一样,第二个看起来很奇怪

数据集:

country id      plan   consolidation_key
AT01    1000    100    A
AT01    1000    200    B
AT01    2000    300    J
AT01    2000    200    K

在Excel文件中

import numpy as np

def consolidate(d):
    columns=['country', 'id', 'consolidation_key']
#    columns=['id', 'consolidation_key']
    return d.groupby(by=columns).agg(
        plans=pd.NamedAgg(
            column="plan", aggfunc=lambda s: "-".join(sorted(set(s.astype(str))))
        )
    )

d = pd.read_excel(r"path\to\file\test_data.xlsx", sheet_name='data')

data = d
df = consolidate(data)
print(df)
print("-----------")
print("dtypes:")
print(data.dtypes)
print("--------------------")

data2 = d.assign(country=lambda x: pd.Categorical(x["country"]))
df2 = consolidate(data2)
print(df2)
print("-----------")
print("dtypes:")
print(data2.dtypes)

合并中的lambda函数不能与示例数据一起充分发挥作用。它创建一个唯一项的列表(100-200

结果是

                               plans
country id   consolidation_key      
AT01    1000 A                   100
             B                   200
        2000 J                   300
             K                   200
-----------
dtypes:
country              object
id                    int64
plan                  int64
consolidation_key    object
dtype: object
--------------------
                               plans
country id   consolidation_key      
AT01    1000 A                   100
             B                   200
             J                   NaN
             K                   NaN
        2000 A                   NaN
             B                   NaN
             J                   300
             K                   200
-----------
dtypes:
country              category
id                      int64
plan                    int64
consolidation_key      object
dtype: object

第一次整合到df看起来不错。进入df2的第二个有NaN值的额外项。它看起来像是两个ID的交叉连接。 有趣的是,这只发生在columns=['country', 'id', 'consolidation_key']时。使用columns=['id', 'consolidation_key'],合并在这两种情况下都能正常工作

这里有一个大问题-这是熊猫中的虫子还是我错过了什么

版本:

  • Python 3.7.3版
  • IPython 7.8.0版
  • 熊猫0.25.1(和0.25.2)

Tags: columns数据keyiddataobjectnancountry
1条回答
网友
1楼 · 发布于 2024-06-17 15:55:08

通过阅读@jezrael的回答中的帖子,我在https://github.com/pandas-dev/pandas/issues/17594#issuecomment-545238294得到了一条重要的评论

observed=True添加到groupby解决了我的问题

def consolidate(d):
columns=['country', 'id', 'consolidation_key']
return d.groupby(by=columns, observed=True).agg(
    plans=pd.NamedAgg(
        column="plan", aggfunc=lambda s: "-".join(sorted(set(s.astype(str))))
    )
)

相关问题 更多 >