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
相关产品推荐
相关产品推荐

