如何在Pandas中按EntityID匹配排序拼接不匹配DataFrame并替换NaN
Pandas实现不匹配记录对齐展示与NaN替换
问题分析
原代码通过concat+drop_duplicates筛选不匹配记录,会导致同EntityID的差异记录被拆分为独立行,无法对齐展示。我们改用**外连接(Outer Join)**结合自定义条件筛选,实现EntityID对齐、NaN替换与排序的需求。
解决方案代码
import pandas as pd # 原始数据 raw = pd.DataFrame({'EntityID': ['Appple', 'Mango','Grapes' ,'Banana'], 'Date': [10, 20, 30,55], 'Val': [10, 30, 15,89]}) bob = pd.DataFrame({'EntityID': ['Appple','Dongo' ,'Banana', 'Mango','Rea','Hpo','Pauy'], 'Date': [10, 20, 30,5,9,8,98], 'Val': [100, 200, 15,21,33,44,44]}) # 1. 外连接所有记录,标记来源并区分字段 full_merge = raw.merge(bob, on='EntityID', how='outer', suffixes=('_raw', '_bob'), indicator=True) # 2. 定义不匹配条件:只在单表中,或EntityID相同但字段值不同 mismatch_condition = ( (full_merge['_merge'] != 'both') | (full_merge['Date_raw'] != full_merge['Date_bob']) | (full_merge['Val_raw'] != full_merge['Val_bob']) ) mismatch = full_merge[mismatch_condition] # 3. 整理为EntityID对齐的结构,替换NaN并排序 fill_text = "No record found for this entity ID" result = ( mismatch.set_index('EntityID')[['Date_raw', 'Val_raw', 'Date_bob', 'Val_bob']] .fillna(fill_text) .sort_index() ) print(result)
代码说明
- 外连接与标记:通过
how='outer'保留所有EntityID,suffixes区分两个表的字段,indicator=True生成_merge列标记记录来源(left_only/right_only/both)。 - 筛选不匹配记录:自定义条件覆盖三种不匹配场景:仅存在于raw、仅存在于bob、EntityID相同但字段值不同。
- 对齐与替换:将EntityID设为索引实现对齐,用
fillna替换缺失值为指定文本,最后按EntityID排序保证条目有序。
输出示例
Date_raw Val_raw Date_bob Val_bob EntityID Appple 10 10 10 100 Banana 55 89 30 15 Dongo No record... No record... 20 200 Grapes 30 15 No record... No record... Hpo No record... No record... 8 44 Mango 20 30 5 21 Pauy No record... No record... 98 44 Rea No record... No record... 9 33
内容的提问来源于stack exchange,提问作者Pratik
相关产品推荐
相关产品推荐

