Pandas如何将DataFrame列中不在指定列表内的值替换为0
Pandas DataFrame 指定列仅保留预定义列表值的实现方案
错误原因
你编写的df.loc[~l1, 0, df.column]不符合loc方法的语法规则,触发TypeError的核心原因有两个:
~是布尔值取反运算符,不能直接作用于普通列表l1loc的标准入参格式为df.loc[行筛选条件, 列名],你传入了3个参数,参数格式错误。
高效实现方法
推荐使用pandas内置的向量化方法Series.isin()实现需求,该方法不需要遍历每行数据,即使处理百万级行的大表也有很高的性能:
方法1:直接修改原列
import pandas as pd l1 = [1,2,5,6] # 筛选列值不在预定义列表内的行,对应位置赋值为0 df.loc[~df['column'].isin(l1), 'column'] = 0
方法2:保留原列,生成新的预期列
# where方法会保留满足条件的原值,不满足条件的位置替换为指定的0 df['Expected column'] = df['column'].where(df['column'].isin(l1), 0)
运行效果验证
执行后输出结果和你要求的效果完全一致:
| column | Expected column |
|---|---|
| 1 | 1 |
| 5 | 5 |
| 2 | 2 |
| 3 | 0 |
| 4 | 0 |
| 3 | 0 |
| 6 | 6 |
内容的提问来源于stack exchange,提问作者Titu
相关产品推荐
相关产品推荐

