我遇到了一些pandas.groupby
的奇怪行为。根据数据列的d类型,我得到了两种完全不同的结果。其中一个和预期一样,第二个似乎很奇怪。
数据集:
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
值的额外项。这看起来像是两个ids的交叉连接。有趣的是,只有在columns=['country', 'id', 'consolidation_key']
时才会发生这种情况。对于columns=['id', 'consolidation_key']
,合并在这两种情况下都是正确的。
这是一个很大的问题--这是熊猫身上的虫子还是我错过了别的什么?
版本:
发布于 2019-10-24 12:12:11
通过阅读@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))))
)
)
https://stackoverflow.com/questions/58540198
复制相似问题