首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pandas.groupby对同一数据的反应不同,使用lambda和分类类型与对象

pandas.groupby对同一数据的反应不同,使用lambda和分类类型与对象
EN

Stack Overflow用户
提问于 2019-10-24 11:18:47
回答 1查看 70关注 0票数 1

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

数据集:

代码语言:javascript
运行
复制
country id      plan   consolidation_key
AT01    1000    100    A
AT01    1000    200    B
AT01    2000    300    J
AT01    2000    200    K

在Excel文件中。

代码语言:javascript
运行
复制
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)。

其结果是

代码语言:javascript
运行
复制
                               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值的额外项。这看起来像是两个ids的交叉连接。有趣的是,只有在columns=['country', 'id', 'consolidation_key']时才会发生这种情况。对于columns=['id', 'consolidation_key'],合并在这两种情况下都是正确的。

这是一个很大的问题--这是熊猫身上的虫子还是我错过了别的什么?

版本:

  • Python 3.7.3
  • IPython 7.8.0
  • Pandas 0.25.1 (和0.25.2)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-24 12:12:11

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

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

代码语言:javascript
运行
复制
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))))
    )
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58540198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档