np.select中Int64与int64类型差异引发报错的原因咨询
Int64类型触发np.select报错的原因解析
报错场景代码
def apply_km_cluster(df): conditions = [ (df['value'].between(0, 20000)), # 0到20000之间 (df['value'].between(20000, 50000)), # 20000到50000之间 (df['value'].between(50000, 100000)), # 50000到100000之间 (df['value'].between(100000, 200000)), # 100000到200000之间 (df['value'] >= 200000) # 大于等于200000 ] values = [1, 2, 3, 4, 5] # 为每个条件分配对应值 df['cluster'] = np.select(conditions, values) return df
问题背景
当DataFrame的value列数据类型为pandas的Int64(可空整数类型)时,执行上述代码会触发报错:TypeError: invalid entry 0 in condlist: should be boolean ndarray,将类型转为numpy的int64后报错消失。
原因解析
类型本质差异
pandas的Int64是自定义的可空整数类型,基于IntegerArray实现,专门支持空值存储;而numpy的int64是原生数值类型,对应的数组是标准numpy ndarray,不支持空值(空值会被强制转为np.nan且类型自动变为float)。比较结果的类型不兼容
对Int64列执行between或>=这类比较操作时,返回的是pandas专属的BooleanArray(表现为dtype为boolean的Series),而非numpy原生的bool类型ndarray。np.select的参数要求
np.select的condlist参数明确要求每个条件必须是布尔类型的numpy数组,它无法识别pandas自定义的BooleanArray结构,因此抛出类型错误。类型转换后的兼容逻辑
当把列转为int64后,比较操作会直接生成numpy的bool类型ndarray,完全符合np.select的参数要求,因此可以正常运行。
补充解决方法(无需转int64)
如果想保留Int64类型,只需把每个条件转为numpy数组即可:
conditions = [ df['value'].between(0, 20000).to_numpy(), df['value'].between(20000, 50000).to_numpy(), df['value'].between(50000, 100000).to_numpy(), df['value'].between(100000, 200000).to_numpy(), (df['value'] >= 200000).to_numpy() ]
内容的提问来源于stack exchange,提问作者Fatih Yavuz
相关产品推荐
相关产品推荐

