Pandas如何判断DataFrame列值是否在列表中生成哑变量
报错原因
你的代码触发错误有两个核心问题:
- 原生Python的
in运算符仅支持判断单个对象是否属于容器,无法对pandas Series做逐元素的成员校验,直接传入Series做in判断时,pandas无法判定你是要判断整个Series是否在列表里,还是要逐行判断每个元素,就会抛出ValueError: The truth value of a Series is ambiguous。 - 代码中引用DataFrame时使用了未定义的变量名
dataset,你实际初始化的DataFrame变量名为df。
实现方案
方案1:使用pandas原生.isin()方法(推荐,性能最好)
.isin()是pandas专门为逐元素成员匹配设计的接口,传入待匹配的列表后会返回和原列等长的布尔序列,直接转成int类型就得到0/1编码的哑变量,代码最简洁执行效率最高:
import pandas as pd import numpy as np df = pd.DataFrame({'variable1':[1,2,3,4,5,6,7,8], 'variable2':['a', 'r', 'b', 'w', 'c', 'p', 'l', 'a']}) my_list = ['a', 'b', 'c', 'd', 'e'] df['variable3'] = df['variable2'].isin(my_list).astype(int)
执行后输出的DataFrame如下:
variable1 variable2 variable3 0 1 a 1 1 2 r 0 2 3 b 1 3 4 w 0 4 5 c 1 5 6 p 0 6 7 l 0 7 8 a 1
方案2:配合np.where实现(适配多条件场景)
如果你需要保留np.where的写法方便后续扩展多条件判断,只需要把判断条件替换为.isin()的逐元素校验即可,逻辑和你最初的写法一致:
df['variable3'] = np.where(df['variable2'].isin(my_list), 1, 0)
避坑提示
- 不要使用逐行
apply的方式实现(比如df['variable2'].apply(lambda x: 1 if x in my_list else 0)),当数据量较大时,这种写法的执行速度比.isin()慢数倍到数十倍。 - 匹配逻辑严格校验数据类型,如果列中元素和列表内值的类型不一致(比如列中是字符串
'2'、列表中是整数2),不会判定为匹配。
内容的提问来源于stack exchange,提问作者G987
相关产品推荐
相关产品推荐

