我遇到了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']
,合并在这两种情况下都能正常工作
这里有一个大问题-这是熊猫中的虫子还是我错过了什么
版本:
通过阅读@jezrael的回答中的帖子,我在https://github.com/pandas-dev/pandas/issues/17594#issuecomment-545238294得到了一条重要的评论
将
observed=True
添加到groupby
解决了我的问题相关问题 更多 >
编程相关推荐