Pandas如何基于多条件修改DataFrame中的多个列值
Pandas多条件筛选修改DataFrame值实现方法
报错原因
你之前的写法触发KeyError,核心原因是df_csv[['A', 'B']] == ['car', 'plane']返回的是和选中列同形状的二维布尔DataFrame,而df.loc的行筛选参数要求传入一维布尔序列/数组,二维布尔对象无法被正确识别为行掩码,就会抛出键错误。
你之前掌握的单条件写法df_csv.loc[df_csv['X'] == 'train', ['A', 'B']] = ['t1', 't2']能正常运行,就是因为单条件判断返回的是一维布尔序列,符合loc的参数要求。
正确实现方式
场景1:要求多个条件同时满足(最常用)
比如你要实现「A列值为'car'且B列值为'plane'时,把A、B两列对应值改为't1'、't2'」,直接用逻辑符连接多个单条件即可,注意每个独立条件必须用圆括号包裹,避免运算符优先级冲突:
df_csv.loc[(df_csv['A'] == 'car') & (df_csv['B'] == 'plane'), ['A', 'B']] = ['t1', 't2']
常用逻辑运算符对应写法:
- 多条件同时满足(逻辑与):用
& - 满足任意一个条件即可(逻辑或):用
| - 对条件取反(逻辑非):用
~
场景2:匹配列数较多时的简化写法
如果需要同时匹配的列数很多,逐列写&连接条件太繁琐,可以用eq搭配all生成一维行掩码,效果和上面逐条件写完全一致:
# 按行判断:A列匹配'car'、B列匹配'plane',所有列都匹配则返回True match_mask = df_csv[['A', 'B']].eq(['car', 'plane']).all(axis=1) df_csv.loc[match_mask, ['A', 'B']] = ['t1', 't2']
注意:如果你的需求是「A列等于'car' 或者 B列等于'plane'就修改值」,只需要把上面代码里的
&换成|,或者把简化写法里的.all(axis=1)换成.any(axis=1)即可。
内容的提问来源于stack exchange,提问作者Delloarc
相关产品推荐
相关产品推荐

