Python:基于指定多列对比两个DataFrame,找出彼此缺失行
对比两个结构相似DataFrame,找出彼此缺失的行
问题描述
需要对比两个列结构相似(非完全一致)的DataFrame,基于key_column1和key_column2两列作为匹配键,生成两个新的DataFrame:
- 一个展示df1中存在但df2中缺失的行
- 另一个展示df2中存在但df1中缺失的行
解决方案
利用Pandas的merge()方法,通过indicator参数标记行的来源,再根据标记筛选出目标行即可。这种方法无需考虑两DataFrame列结构的差异,缺失列会自动用NaN填充。
完整代码示例
import pandas as pd # 示例数据1 data1 = { 'first_column': ['4', '2', '7', '2', '2'], 'second_column': ['1', '2', '2', '2', '2'], 'key_column1': ['1', '3', '2', '6', '4'], 'key_column2': ['1', '2', '2', '1', '1'], 'fourth_column': ['1', '2', '2', '2', '2'], 'other': ['1', '2', '3', '2', '2'], } df1 = pd.DataFrame(data1) # 示例数据2 data2 = { 'first': ['1', '2', '2', '2', '2'], 'second_column': ['1', '2', '2', '2', '2'], 'key_column1': ['1', '3', '2', '6', '4'], 'key_column2': ['1', '5', '2', '2', '2'], 'fourth_column': ['1', '2', '2', '2', '2'], 'other2': ['1', '4', '3', '2', '2'], 'other3': ['6', '8', '1', '4', '2'], } df2 = pd.DataFrame(data2) # 基于两个键列进行全外连接,标记行来源 merged_df = pd.merge(df1, df2, on=['key_column1', 'key_column2'], how='outer', indicator=True) # 筛选df1独有的行(即df1相对于df2缺失的行) df1_missing_in_df2 = merged_df[merged_df['_merge'] == 'left_only'].drop('_merge', axis=1) # 筛选df2独有的行(即df2相对于df1缺失的行) df2_missing_in_df1 = merged_df[merged_df['_merge'] == 'right_only'].drop('_merge', axis=1) # 输出结果 print("df1中存在但df2中缺失的行:") print(df1_missing_in_df2) print("\ndf2中存在但df1中缺失的行:") print(df2_missing_in_df1)
代码说明
- 全外连接(outer merge):
how='outer'会保留两个DataFrame的所有行,匹配不上的行用NaN填充缺失的列。 - 标记行来源:
indicator=True会新增_merge列,取值为:left_only:仅在df1中存在的行right_only:仅在df2中存在的行both:在两个DataFrame中都存在的行
- 筛选目标行:通过
_merge列的值筛选出目标行,最后删除_merge列得到干净的结果。
运行结果
df1_missing_in_df2会包含df1中key_column1和key_column2组合为(3,2)、(6,1)、(4,1)的行df2_missing_in_df1会包含df2中key_column1和key_column2组合为(3,5)、(6,2)、(4,2)的行
内容的提问来源于stack exchange,提问作者yoopiyo
相关产品推荐
相关产品推荐

