Python Pandas合并两个DataFrame并标记差异与缺失项
DataFrame合并并标记差异的实现方案
原始数据
import pandas as pd # First Dataframe df1 = pd.DataFrame({ 'name': ['Adam','Ashley','Adam','Don',], 'items': ['Apple','Banana','Cherry','Date'], 'Quantity': [10,15,20,25] }) # second dataframe df2 = pd.DataFrame({ 'name': ['Adam','Ashley','Adam','Sunny'], 'items': ['Apple','Banana','Scale','Pickle'], 'Quantity': [11,10,15,20] })
需求回顾
- 按
name遍历两个DataFrame,收集每个name的相关条目 - 标记差异类型:数量不匹配、物品仅单方存在、某name仅单方存在
- 每个name处理完成后添加空行分隔
实现代码
# 按name和items做外连接,保留两边所有条目 merged = pd.merge( df1, df2, on=['name', 'items'], how='outer', suffixes=('_df1', '_df2'), indicator=True ) # 定义函数标记差异原因 def get_diff_reason(row): if row['_merge'] == 'both': # 两边都有相同name和items,检查数量 return '数量不匹配' if row['Quantity_df1'] != row['Quantity_df2'] else '无差异' elif row['_merge'] == 'left_only': return '仅存在于df1' else: return '仅存在于df2' merged['差异原因'] = merged.apply(get_diff_reason, axis=1) # 整理列顺序,移除_merge辅助列 result = merged[['name', 'items', 'Quantity_df1', 'Quantity_df2', '差异原因']] # 按name分组,每组后添加空行分隔 df3_list = [] for _, group in result.groupby('name', sort=False): df3_list.append(group) # 生成空行,列数与分组一致 empty_row = pd.DataFrame([[None]*len(group.columns)], columns=group.columns) df3_list.append(empty_row) # 合并所有分组,移除最后一行多余空行 df3 = pd.concat(df3_list).reset_index(drop=True).iloc[:-1] # 打印结果 print(df3)
代码说明
- 外连接合并:通过
how='outer'的merge操作,确保两边所有name+items组合都被保留,_merge列标记条目来源。 - 差异标记:通过
apply遍历每一行,根据_merge值和数量对比结果生成差异原因。 - 空行分隔:按
name分组后,给每个分组追加空行,最后合并时移除末尾多余的空行。
运行结果示例
name items Quantity_df1 Quantity_df2 差异原因 0 Adam Apple 10.0 11.0 数量不匹配 1 Adam Cherry 20.0 NaN 仅存在于df1 2 Adam Scale NaN 15.0 仅存在于df2 3 NaN NaN NaN NaN NaN 4 Ashley Banana 15.0 10.0 数量不匹配 5 NaN NaN NaN NaN NaN 6 Don Date 25.0 NaN 仅存在于df1 7 NaN NaN NaN NaN NaN 8 Sunny Pickle NaN 20.0 仅存在于df2
内容的提问来源于stack exchange,提问作者Kush
相关产品推荐
相关产品推荐

