Pandas qcut处理含无穷值数据报错:旧版本可用1.5版本失效求答疑
Pandas 1.5+中pd.qcut处理np.inf报错:是Bug还是有意设计?
问题背景
- Pandas 1.1.5及更早版本里,用
pd.qcut给分箱两端设np.inf完全没问题 - 升级到1.5版本后,运行
pd.qcut([1,2,3,4,5,-np.inf, np.inf], q=3, duplicates="drop")会弹出ValueError: missing values must be missing in the same location both left and right sides错误 - 要是省略
duplicates参数,又会出现ValueError: Bin edges must be unique: array([nan, 2., 4., nan]). You can drop duplicate edges by setting the 'duplicates' kwarg错误 - 目前只能临时用
1e9这类极大值替换np.inf,但远不如直接用无穷值方便
结论:这是有意调整,不是Bug
Pandas 1.5版本后对分箱逻辑做了调整:np.inf和-np.inf在计算分箱边缘时会被当作缺失值(nan)处理。当数组里包含无穷值时,自动计算的分位数边界会出现nan,触发了唯一性检查或者缺失值位置匹配的校验规则,所以才会报错。
更便捷的替代方案
如果想继续用无穷值实现两端分箱,别让qcut自动算边界,手动指定分箱区间就行:
import pandas as pd import numpy as np data = [1,2,3,4,5,-np.inf, np.inf] # 先计算数据的分位数,再把无穷值补到两端当边界 quantiles = pd.Series(data).quantile([1/3, 2/3]).values bins = [-np.inf, *quantiles, np.inf] result = pd.cut(data, bins=bins)
这样既保留了无穷值的便捷性,又避开了qcut的报错问题。
内容的提问来源于stack exchange,提问作者Hans Bambel
相关产品推荐
相关产品推荐

