基于列表条件创建变量报错,寻求多元素列表简洁实现方案
基于列表与多条件创建变量的简洁实现方法
问题场景
想要创建一个新变量,取值逻辑为:当观测值的「Employement Sector」属于指定列表,且「Monthly salary in hand」数值小于3000时标记为1,否则为0。
尝试了以下代码但报错:
emp_list1 = ["Gov.Sector","Semi Gov.Sector"] PF_deftag['emp_grp1'] = np.where( (PF_deftag['Employement Sector'] in ['emp_list1'] ) & (PF_deftag['Monthly salary in hand'].astype(float) < 3000), 1, 0 )
错误信息:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
目前通过多个==加|的方式可以正常运行,但列表元素增多后代码会变得冗长:
PF_deftag['emp_grp1'] = np.where( ((PF_deftag['Employement Sector'] == "Gov.Sector") | (PF_deftag['Employement Sector'] == "Semi Gov.Sector")) & (PF_deftag['Monthly salary in hand'].astype(float) < 3000), 1, 0 )
错误原因
- 误用Python原生
in:Pandas Series不能直接用in判断元素是否属于列表,这会触发整个Series的布尔值判断,导致歧义报错,应该用Pandas提供的isin()方法。 - 语法错误:代码中
['emp_list1']是把变量名作为字符串元素,而非引用定义好的列表emp_list1。
简洁实现方法
使用isin()方法替代多个==的或逻辑,不管列表有多少元素,代码都能保持简洁:
emp_list1 = ["Gov.Sector","Semi Gov.Sector"] PF_deftag['emp_grp1'] = np.where( PF_deftag['Employement Sector'].isin(emp_list1) & (PF_deftag['Monthly salary in hand'].astype(float) < 3000), 1, 0 )
补充说明
isin()方法会返回一个布尔Series,对应每个元素是否在指定列表中,完美适配np.where的条件要求。- 如果「Monthly salary in hand」字段已经是数值类型,可以去掉
.astype(float)转换,提升运行效率。
内容的提问来源于stack exchange,提问作者matthew freeman
相关产品推荐
相关产品推荐

