如何解决py:55: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning. grouped = df.groupby(‘range’)[‘newapi’].apply(list).to_dict()问题
在使用 Pandas 进行分组(groupby
)操作时,你可能会遇到如下警告:
FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas.
Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.
grouped = df.groupby('range')['newapi'].apply(list).to_dict()
此警告提示:在未来的 Pandas 版本中,groupby
对类别(Categorical)数据的默认行为将从 observed=False
改为 observed=True
。如果不做任何修改,在版本升级后,代码的分组结果可能会发生变化,或者需要对新行为进行适配。
本文将从以下几个方面,超详细地讲解如何:
observed
参数来解决或消除警告大家好,我是 猫头虎,猫头虎技术团队创始人,也被大家称为猫哥。我目前是COC北京城市开发者社区主理人、COC西安城市开发者社区主理人,以及云原生开发者社区主理人,在多个技术领域如云原生、前端、后端、运维和AI都具备丰富经验。
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用方法、前沿科技资讯、产品评测、产品使用体验,以及产品优缺点分析、横向对比、技术沙龙参会体验等。我的分享聚焦于云服务产品评测、AI产品对比、开发板性能测试和技术报告。
目前,我活跃在CSDN、51CTO、腾讯云、阿里云开发者社区、知乎、微信公众号、视频号、抖音、B站、小红书等平台,全网粉丝已超过30万。我所有平台的IP名称统一为猫头虎或猫头虎技术团队。
我希望通过我的分享,帮助大家更好地掌握和使用各种技术产品,提升开发效率与体验。
作者名片 ✍️
部分专栏链接
:
🔗 精选专栏:
假设有如下示例数据,其中 range
列为类别(Categorical)类型:
import pandas as pd
# 构造示例 DataFrame
df = pd.DataFrame({
'range': pd.Categorical(
['A', 'B', 'A', 'C', 'B', 'A'],
categories=['A', 'B', 'C', 'D'], # D 虽然在 categories 中,但不在数据中出现
ordered=False
),
'newapi': [1, 2, 3, 4, 5, 6]
})
# 直接 groupby,未指定 observed
grouped = df.groupby('range')['newapi'].apply(list).to_dict()
运行后,你会看到:
FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.
grouped = df.groupby('range')['newapi'].apply(list).to_dict()
observed=False
:
observed=True
:
observed
?observed=False
(默认行为):
返回完整的类别索引(包括那些未出现在数据中的类别),保证结果长度与分类定义一致。observed=True
:
只“观测”(observe)到真实出现的类别,跳过未出现的类别,结果更为精简。False
改为 True
会影响现有代码:
observed=False
;observed=True
,同时消除警告。observed=False
)在需要“全类别输出”时,显式传入 observed=False
:
grouped = (
df
.groupby('range', observed=False)['newapi']
.apply(list)
.to_dict()
)
observed=True
)如果你只关心“实际出现”的分组,改为 observed=True
:
grouped = (
df
.groupby('range', observed=True)['newapi']
.apply(list)
.to_dict()
)
如果暂时无法判断应该保留哪种行为,可以在开发环境或测试环境中,先使用 observed=True
与 observed=False
两个版本分别运行,比较输出差异,再决定。示例:
# 试验性比较
g_false = df.groupby('range', observed=False)['newapi'].apply(list).to_dict()
g_true = df.groupby('range', observed=True)['newapi'].apply(list).to_dict()
print("False 全类别:", g_false)
print("True 实际类别:", g_true)
import pandas as pd
# 1. 准备数据
df = pd.DataFrame({
'range': pd.Categorical(['A','B','A','C','B','A'], categories=['A','B','C','D']),
'newapi': [1, 2, 3, 4, 5, 6]
})
# 2. 保持当前行为,显式 observed=False
grouped_keep_all = df.groupby('range', observed=False)['newapi'].apply(list).to_dict()
print("保留全部类别(含空分组):", grouped_keep_all)
# 输出: {'A': [1, 3, 6], 'B': [2, 5], 'C': [4], 'D': []}
# 3. 采用未来默认,显式 observed=True
grouped_observed_only = df.groupby('range', observed=True)['newapi'].apply(list).to_dict()
print("仅观测到的类别:", grouped_observed_only)
# 输出: {'A': [1, 3, 6], 'B': [2, 5], 'C': [4]}
observed=False
或 True
,方便团队成员理解;requirements.txt
或 setup.py
中锁定 Pandas 版本范围,避免无意中升级到引入新默认的版本;observed
参数;observed
在不同参数下的输出,保证升级后不会引入潜在 bug;observed
设置,便于追踪和排查。Pandas 团队对 observed
默认值的调整,是为了提升分组操作的灵活性与性能。但在实际项目中,我们要有意识地显式声明该参数,以保持代码的可预测性与稳定性。本文从警告重现、机制解析、两种解决方案、完整代码示例到最佳实践,超详细地剖析了 FutureWarning: observed
参数的处理方式。希望对你的项目升级和日常开发有所帮助!
👉 更多信息:有任何疑问或者需要进一步探讨的内容,欢迎点击文末名片获取更多信息。我是猫头虎博主,期待与您的交流! 🦉💬