gpt4 book ai didi

python - pandas.groupby 使用分类类型与对象的 lambda aggfunc 对相同数据做出不同的 react

转载 作者:太空宇宙 更新时间:2023-11-03 20:14:26 29 4
gpt4 key购买 nike

我遇到了 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'],合并在这两种情况下都能正常工作。

这是一个大问题 - 这是 pandas 中的错误还是我错过了其他东西?

版本:

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

最佳答案

阅读@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))))
)
)

关于python - pandas.groupby 使用分类类型与对象的 lambda aggfunc 对相同数据做出不同的 react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58540198/

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