Pandas基于多列值新增列时np.select触发类型错误如何解决?
报错原因
np.select要求传入的条件列表每个元素是和原数据集长度一致的布尔数组,用于逐行匹配条件。原代码中使用df_1.loc[判断条件]返回的是符合条件的子DataFrame,不满足参数要求,直接触发TypeError: invalid entry 0 in condlist: should be boolean ndarray报错。- 数据中B、C列混入了空字符串,列类型为object而非数值类型,直接做数值比较也可能引发类型异常,部分低版本numpy、pandas混用场景下会触发参数不匹配的
na关键字相关报错。
解决方法
先将B、C列转为数值类型,空值统一处理为NaN,再调整条件列表的写法即可:
import pandas as pd import numpy as np data_1 = {'A': ['Emo/3', 'Emo/4', 'Emo/1','Emo/3', '','Emo/3', 'Emo/4', 'Emo/1','Emo/3', '', 'Neu/5', 'Neu/2','Neu/5', 'Neu/2'], 'Pos': ["repeat3", "repeat3", "repeat3", "repeat3", '',"repeat1", "repeat1", "repeat1", "repeat1", '', "repeat2", "repeat2","repeat2", "repeat2"], 'B': [0, 0, 0, 0, '', 1, 2, 3, 4, '', 4, 2, 3, 1],'C': [0, 2, 1, 3, '', 4, 2, 3, 1, '', 4, 2, 3, 1]} df_1 = pd.DataFrame(data_1) # 处理B、C列为数值类型,空值转为NaN df_1['B'] = pd.to_numeric(df_1['B'], errors='coerce') df_1['C'] = pd.to_numeric(df_1['C'], errors='coerce') # 条件直接写布尔判断表达式,无需套loc conditions = [ (df_1['B'] == 1) & (df_1['C'] == 1), (df_1['B'] == 2) & (df_1['C'] == 1), (df_1['B'] == 3) & (df_1['C'] == 1) ] choices = [1,1,0] df_1['D'] = np.select(conditions, choices, default='')
运行后新列D会按照规则赋值,不满足条件的位置留空,符合需求。
内容的提问来源于stack exchange,提问作者Catherine
相关产品推荐
相关产品推荐

