Pandas分箱后调用np.unique报错:float与Interval无法比较
问题:分箱后提取唯一区间时出现类型不匹配错误
我在处理DataFrame数据时,按2单位间隔对i_h100列分箱,再提取生成的所有唯一区间列表。代码如下:
df = gpd.read_file(file) final = df[df['i_h100']>=0] final['H_bins']=pd.cut(x=final['i_h100'], bins=np.arange(0, 120+2, 2)) HBins = list(np.unique(final['H_bins']))
多数DataFrame运行正常,但偶尔会出现如下错误:
Traceback (most recent call last): File "/var/folders/bg/5n2pqdj53xv1lm099dt8z2lw0000gn/T/ipykernel_2222/1548505304.py", line 1, in <cell line: 1> HBins = list(np.unique(final['H_bins'])) File "<__array_function__ internals>", line 180, in unique File "/Users/heatherkay/miniconda3/envs/gpd/lib/python3.9/site-packages/numpy/lib/arraysetops.py", line 272, in unique ret = _unique1d(ar, return_index, return_inverse, return_counts) File "/Users/heatherkay/miniconda3/envs/gpd/lib/python3.9/site-packages/numpy/lib/arraysetops.py", line 333, in _unique1d ar.sort() TypeError: '<' not supported between instances of 'float' and 'pandas._libs.interval.Interval'
错误原因
报错核心是final['H_bins']列同时存在两种类型的数据:pandas.Interval(正常分箱结果)和float(即NaN值)。当pd.cut遇到超出设定bins范围的数值,或者原i_h100列存在NaN时,会生成NaN填充对应的H_bins行。numpy的unique方法在排序去重时,无法对float和Interval两种不同类型的数据做比较,因此抛出错误。
解决方法
方法1:改用pandas自带的unique方法
pandas的Series.unique()可以正确处理包含NaN的Interval列,无需类型转换:
HBins = list(final['H_bins'].unique())
方法2:提前清理数据或调整分箱范围
- 过滤原数据中的NaN值,确保分箱的列无缺失:
final = df[(df['i_h100']>=0) & (~df['i_h100'].isna())] final['H_bins']=pd.cut(x=final['i_h100'], bins=np.arange(0, 120+2, 2)) HBins = list(np.unique(final['H_bins']))
- 动态调整分箱上限,确保覆盖所有数据:
final = df[df['i_h100']>=0] max_val = final['i_h100'].max() final['H_bins']=pd.cut(x=final['i_h100'], bins=np.arange(0, max_val + 2, 2)) HBins = list(np.unique(final['H_bins']))
方法3:提取后过滤NaN
如果需要保留分箱结果中的NaN,但只想获取有效区间列表:
HBins = [bin_interval for bin_interval in final['H_bins'].unique() if pd.notna(bin_interval)]
内容的提问来源于stack exchange,提问作者Heather Kay
相关产品推荐
相关产品推荐

