You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 22:45:50