求助:对比两个DataFrame,提取df1中df2无的Name对应数据
如何从df1中筛选出df2没有的Name对应的完整行
原代码问题分析
- 逻辑方向错误:你使用
df2.merge(df1, how='left')是保留df2的所有行,匹配df1的数据,left_only会返回df2存在但df1不存在的行,这和你要的“df1存在但df2不存在”的需求完全相反。 - 列名冗余空格:代码中
['location ', 'Name']的location多了一个空格,和实际列名location不匹配(不过当前报错的核心原因是left_only无数据)。 - 无匹配结果:你的
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
相关产品推荐
相关产品推荐

