如何对比两个DataFrame并根据数据匹配情况设置新列值
实现DataFrame行匹配并新增标记列
需求说明
现有两个DataFrame(data1和data2),需完成以下操作:
- 检查
data1中的每一行是否在data2中完全存在 - 为
data1新增列new_col,存在则赋值为"Open",不存在则赋值为"New"
示例数据
data1 = {'A': [1, 2, 3, 4, 5], 'B': ['apple', 'banana', 'orange', 'apple', 'grape'], 'C': [10, 20, 30, 40, 50]} data2 = {'A': [1, 2, 6],'B': ['apple', 'banana', 'kiwi'], 'C': [10, 20, 60]}
预期结果
# 转换为DataFrame后的输出 A B C new_col 0 1 apple 10 Open 1 2 banana 20 Open 2 3 orange 30 New 3 4 apple 40 New 4 5 grape 50 New
解决方案
以下提供几种实用方法,可根据数据量大小选择:
方法1:使用apply逐行判断(适合小数据集)
通过apply遍历data1的每一行,判断该行是否存在于data2的记录中:
import pandas as pd df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2) # 逐行匹配并赋值 df1['new_col'] = df1.apply( lambda row: 'Open' if row.to_dict() in df2.to_dict('records') else 'New', axis=1 ) print(df1)
方法2:使用merge左连接(适合大数据集,效率更高)
利用pandas的合并操作标记匹配行,再填充结果:
import pandas as pd df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2) # 给data2添加匹配标记 df2['_match_flag'] = True # 左连接保留data1所有行,匹配成功则标记为True merged_df = df1.merge(df2, on=['A', 'B', 'C'], how='left') # 根据标记列生成new_col df1['new_col'] = merged_df['_match_flag'].map({True: 'Open'}).fillna('New') print(df1)
方法3:转换为元组集合查找(平衡效率与可读性)
将data2的行转换为元组存入集合,利用集合的快速查找特性判断匹配:
import pandas as pd df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2) # 将data2的行转为元组集合 data2_rows = set(df2.itertuples(index=False, name=None)) # 遍历data1行判断是否在集合中 df1['new_col'] = df1.apply( lambda row: 'Open' if row.itertuples(index=False, name=None) in data2_rows else 'New', axis=1 ) print(df1)
内容的提问来源于stack exchange,提问作者jnyz
相关产品推荐
相关产品推荐

