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

Pandas合并DataFrame后,如何提取两列的唯一差异值?

解决方法

你用drop_duplicates没得到预期结果,核心问题是没用到keep=False参数,或者合并两个列的逻辑没配合到位。默认keep='first'只会保留重复项的第一次出现,而你要的是去掉两个表中都存在的重复值,只留两边独有的数据(也就是本周新增、上周删除的内容)。

下面给两种实用的实现方式:

方法1:合并后快速去重

先把两个表的目标列合并,再用drop_duplicates(subset='目标列名', keep=False)过滤掉两边都有的值:

import pandas as pd

# 读取两个Excel的目标列
df_last_week = pd.read_excel('上周数据.xlsx', usecols=['目标列'])
df_this_week = pd.read_excel('本周数据.xlsx', usecols=['目标列'])

# 合并两个表的目标列
combined_col = pd.concat([df_last_week['目标列'], df_this_week['目标列']], ignore_index=True)

# 仅保留只出现过一次的值(即两边独有的数据)
unique_values = combined_col.drop_duplicates(keep=False)

# 输出到新Excel
unique_values.to_frame('目标列').to_excel('变更结果.xlsx', index=False)

如果需要标记数据来源(上周/本周),可以给每个表加标识后再合并:

df_last_week['来源'] = '上周'
df_this_week['来源'] = '本周'
combined_df = pd.concat([df_last_week, df_this_week], ignore_index=True)
unique_df = combined_df.drop_duplicates(subset='目标列', keep=False)
unique_df.to_excel('变更结果.xlsx', index=False)

方法2:用Merge精准区分新增/删除

要是想明确区分哪些是本周新增、哪些是上周删除的,用merge的连接逻辑筛选更清晰:

import pandas as pd

df_last = pd.read_excel('上周数据.xlsx', usecols=['目标列'])
df_this = pd.read_excel('本周数据.xlsx', usecols=['目标列'])

# 筛选上周有、本周没有的删除项
deleted = df_last.merge(df_this, on='目标列', how='left', indicator=True)
deleted = deleted[deleted['_merge'] == 'left_only'].drop('_merge', axis=1)
deleted['类型'] = '已删除'

# 筛选本周有、上周没有的新增项
added = df_this.merge(df_last, on='目标列', how='left', indicator=True)
added = added[added['_merge'] == 'left_only'].drop('_merge', axis=1)
added['类型'] = '新增'

# 合并结果并输出
result = pd.concat([deleted, added], ignore_index=True)
result.to_excel('变更明细.xlsx', index=False)

为什么你之前的drop_duplicates没生效?

默认drop_duplicates(keep='first')会保留重复值的第一次出现——比如上周存在的值本周又出现,会留下上周的记录、删掉本周的,这完全不符合你要的“仅保留变更数据”的需求。而keep=False会删掉所有重复出现的行,只留下仅在单个表中出现的值,正好匹配你的预期。

内容的提问来源于stack exchange,提问作者Bad_Syntax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:15:09