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

求助:对比两个DataFrame,提取df1中df2无的Name对应数据

如何从df1中筛选出df2没有的Name对应的完整行

原代码问题分析

  1. 逻辑方向错误:你使用df2.merge(df1, how='left')是保留df2的所有行,匹配df1的数据,left_only会返回df2存在但df1不存在的行,这和你要的“df1存在但df2不存在”的需求完全相反。
  2. 列名冗余空格:代码中['location ', 'Name']的location多了一个空格,和实际列名location不匹配(不过当前报错的核心原因是left_only无数据)。
  3. 无匹配结果:你的df2所有记录在df1中都能找到,所以left_only筛选后返回空DataFrame,导致出现Index: []。

正确解决方案

解法1:使用merge的outer连接筛选左表独有行

通过outer连接两个DataFrame,利用_merge字段筛选出df1独有的行:

import pandas as pd

# 读取数据
df1 = pd.read_csv("file1.csv", sep=",", header=0)
df2 = pd.read_csv("file2.csv", sep=",", header=0)

# 按多列(Co_Name、location、Name)进行outer连接,添加_merge标识
merged_df = df1.merge(
    df2,
    on=['Co_Name', 'location', 'Name'],
    how='outer',
    indicator=True
)

# 筛选df1独有行,并移除_merge列
result_df = merged_df[merged_df['_merge'] == 'left_only'].drop('_merge', axis=1)
print(result_df)

解法2:用isin()直接筛选(更简洁)

如果只需要按Name字段匹配,直接用isin()取反筛选:

import pandas as pd

df1 = pd.read_csv("file1.csv", sep=",", header=0)
df2 = pd.read_csv("file2.csv", sep=",", header=0)

# 提取df2中的Name集合
df2_name_set = df2['Name']

# 筛选df1中Name不在df2_name_set的行
result_df = df1[~df1['Name'].isin(df2_name_set)]
print(result_df)

进阶:多列严格匹配

如果需要确保Co_Name、location、Name三者完全匹配才排除(避免同名不同地区的误删),可以使用元组组合匹配:

import pandas as pd

df1 = pd.read_csv("file1.csv", sep=",", header=0)
df2 = pd.read_csv("file2.csv", sep=",", header=0)

# 生成df2的多列组合元组
df2_combinations = df2[['Co_Name', 'location', 'Name']].apply(tuple, axis=1)

# 筛选df1中不在组合内的行
result_df = df1[~df1[['Co_Name', 'location', 'Name']].apply(tuple, axis=1).isin(df2_combinations)]
print(result_df)

内容的提问来源于stack exchange,提问作者Murugesan Madappan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:27:43