Pandas多列条件匹配修改列值未生效问题求助
Pandas多列条件匹配问题修复
错误原因
你的代码核心问题是用了Python原生的is not None做Series非空判断:is/is not是用于判断单个对象本身的身份是否一致,df['A'] is not None实际是判断整个Series对象是否为None,返回值永远是单个布尔值True,因此前两个条件全程生效,最终等价于只有df['C'] == '0'的判断在起作用,导致所有C列为'0'的行都被修改。
修复方案
Pandas中逐元素判断非空需要使用内置的.notna()方法,有两种实现方式可选:
方式1:修改你原有的np.select逻辑
import numpy as np import pandas as pd df = pd.DataFrame({"A":['something',None,'filled',None], "B":['test','test','test',None], "C":['rt','0','0','0']}) # 替换is not None为.notna()做逐元素非空判断 conditions = [(df['A'].notna()) & (df['B'].notna()) & (df['C'] == '0')] values = ['new'] df['C'] = np.select(conditions, values, default=df["C"])
方式2:更简洁的loc写法(无需引入numpy)
df = pd.DataFrame({"A":['something',None,'filled',None], "B":['test','test','test',None], "C":['rt','0','0','0']}) df.loc[df['A'].notna() & df['B'].notna() & (df['C'] == '0'), 'C'] = 'new'
运行结果
最终输出的df符合需求,仅A、B同时非空且C为'0'的行会被修改:
| A | B | C |
|---|---|---|
| something | test | rt |
| None | test | 0 |
| filled | test | new |
| None | None | 0 |
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

