python - pandas.groupby 使用具有分类类型与对象的 lambda aggfunc 对相同数据做出不同反应
问题描述
我遇到了一些奇怪的行为pandas.groupby
。根据我的数据列的 dtype,我得到两个完全不同的结果。其中一个和预期的一样,第二个看起来很奇怪。
数据集:
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)
解决方案
阅读@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))))
)
)
推荐阅读
- c++ - 在工厂类中使用单例 (C++)
- sql - Oracle Query 需要很长时间才能执行
- amazon-web-services - 从不同的计算机访问 Kubernetes 集群的 API
- angularjs - (NodeJS / AngularJS)向服务器发送带有'x-auth'令牌的POST请求,但令牌似乎在预检中丢失(虽然没有错误)
- c# - 我希望我的代码转换为 lambda / linq 表达式
- c++ - 向量的 C++ 代码中的运行时错误
- python - 在 ubuntu 16.04 上使用 mod_wsgi 和 apache2.4 部署 django 2.0 和 python3.6
- python - 使用轮廓检测从图像中提取所需数据
- python - 无法在 windows 上安装 pip
- android - Android:如何对“IllegalStateException:onSaveInstanceState 后无法执行此操作”进行单元测试