如何用pandas的.loc实现嵌套if条件的字段赋值逻辑?
用Pandas实现嵌套条件赋值的方案
当然可以用.loc实现你要的嵌套逻辑!这也是pandas里最推荐的向量化操作方式,效率拉满,完全不用写循环。咱们直接看具体实现:
方法一:用.loc分步处理(最直观)
你的需求可以拆成两个独立的赋值操作,都基于外层的Address条件,再叠加各自的子条件:
# 处理name1:当Address属于NJ/NY,且name1是john/bob时,设为'N/A' df1.loc[(df1.Address.isin(['NJ', 'NY'])) & (df1.name1.isin(['john', 'bob'])), 'name1'] = 'N/A' # 处理name2:当Address属于NJ/NY,且name2是mayer/dylan时,设为'N/A' df1.loc[(df1.Address.isin(['NJ', 'NY'])) & (df1.name2.isin(['mayer', 'dylan'])), 'name2'] = 'N/A'
这里要注意两个点:
- 每个条件都要用括号括起来,因为pandas的运算符优先级会影响条件组合的结果
- 用
&表示逻辑“且”,不要用Python原生的and,因为后者不支持向量化操作
这种方式完全遵循pandas的最佳实践,不会触发SettingWithCopyWarning,而且大数据量下性能比循环高很多。
方法二:用numpy.where实现(另一种向量化思路)
如果你习惯用条件表达式的方式,也可以用numpy.where来完成,效果是一样的:
import numpy as np # 处理name1 df1['name1'] = np.where( (df1.Address.isin(['NJ', 'NY'])) & (df1.name1.isin(['john', 'bob'])), 'N/A', df1['name1'] ) # 处理name2 df1['name2'] = np.where( (df1.Address.isin(['NJ', 'NY'])) & (df1.name2.isin(['mayer', 'dylan'])), 'N/A', df1['name2'] )
这个方法的逻辑是:满足条件就赋值为'N/A',不满足就保留原字段值,和.loc的效果完全一致,只是写法不同而已。
避坑提醒
别用链式索引的方式赋值(比如df1[df1.Address.isin(['NJ','NY'])].name1 = 'N/A'),这种写法可能会触发SettingWithCopyWarning,而且有时候会出现修改不生效的情况,.loc才是安全的赋值方式。
内容的提问来源于stack exchange,提问作者singularity2047
相关产品推荐
相关产品推荐

