You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:15:15