Pandas比对两个DataFrame值 匹配后更新对应列内容为yes/no
实现方案
核心思路
- 先提取df1的c1列作为待匹配的目标列表
- 统一处理df2的c2列格式,将不同类型的取值(列表、单个值、空值)统一转换为集合,方便快速判断元素存在性
- 遍历每个目标值作为列名,逐行判断该值是否在当前行的c2集合中,赋值
yes或no
完整可运行代码
import pandas as pd # 构造测试数据df1 inp1 = [{'c1':'test1'}, {'c1': 'test2'}, {'c1':'test3'}] df1 = pd.DataFrame(inp1) # 构造测试数据df2 inp2 = [{'c1':10, 'c2':['test1', 'teest2'], 'test1':'', 'teest2':''}, {'c1':11,'c2':'teest2'}, {'c1':12,'c2':120}, {'test1':''}, {'teest2':''}] df2 = pd.DataFrame(inp2) # 步骤1:提取待匹配目标列表 target_cols = df1['c1'].tolist() # 步骤2:定义c2值转集合的辅助函数,统一格式避免类型不匹配问题 def c2_to_set(val): if pd.isna(val): return set() if isinstance(val, list): return set(map(str, val)) return {str(val)} # 步骤3:逐列赋值判断结果 for col in target_cols: # 确保目标列存在于df2中,不存在则自动新增 if col not in df2.columns: df2[col] = '' df2[col] = df2['c2'].apply(lambda x: 'yes' if col in c2_to_set(x) else 'no') # 输出最终结果 print(df2)
调整说明
如果需要匹配不区分大小写,或者调整yes/no的大小写格式,直接修改apply逻辑中的返回值即可。
内容的提问来源于stack exchange,提问作者user5813190
相关产品推荐
相关产品推荐

