Python pandas如何提取某列中不在另外两列的值并存入新列
Pandas多列值比对提取第三列独有值
需求说明
- 核心目标:对pandas DataFrame做多列值比对,提取第三列中未在前两列出现过的值,填充到指定结果列
- 匹配规则:
- 取
Want_value、Unwanted_value两列的所有非空值,去重后构成比对基准值集合 - 逐行匹配
new_all_data列的取值,筛选出不在基准集合内的值 - 将筛选得到的值填充到当前全为空的
new_values列对应行,其余行保留空值
- 取
- 示例预期结果:符合筛选规则的值为
j、k
可复现测试数据
import pandas as pd from numpy import nan df = pd.DataFrame ({ 'Want_value': ['a', 'c', 'c', 'c', 'v', 'b', nan, nan, nan, nan, nan, nan, nan], 'Unwanted_value': ['r', 't', 't', 'z', 't', nan, nan, nan, nan, nan, nan, nan, nan], 'new_all_data': ['r', 'z', 'a', 'c', 't', 'v', 'b', 'j', 'r', 't', 'v', 'a', 'k'], 'new_values': [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] })
数据结构参考截图:
实现代码
用pandas原生向量化操作实现,执行效率高,逻辑清晰:
# 合并前两列非空值生成排除集合 exclude_vals = set(df['Want_value'].dropna()) | set(df['Unwanted_value'].dropna()) # 逐行判断填充new_values列,符合条件保留原值,不符合则置为空 df['new_values'] = df['new_all_data'].where(~df['new_all_data'].isin(exclude_vals), nan)
执行后new_values列会在new_all_data为j、k的两行保留对应值,其余行保持空值,完全匹配预期结果。
内容的提问来源于stack exchange,提问作者Firefoxer
相关产品推荐
相关产品推荐

