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

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]
})

需求回顾

  1. 按name遍历两个DataFrame,收集每个name的相关条目
  2. 标记差异类型:数量不匹配、物品仅单方存在、某name仅单方存在
  3. 每个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)

代码说明

  1. 外连接合并:通过how='outer'的merge操作,确保两边所有name+items组合都被保留,_merge列标记条目来源。
  2. 差异标记:通过apply遍历每一行,根据_merge值和数量对比结果生成差异原因。
  3. 空行分隔:按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:02:39