pandas使用merge合并DataFrame后行数异常增多问题求助
行数异常增加的核心原因
- merge操作匹配时对重复的合并键会生成笛卡尔积结果:当data_01中存在n行完全相同的合并键组合,data_02中对应存在m行相同的合并键组合时,合并后会生成
n*m行数据,而非预期的n行。本次多了4行,说明存在两组各2个重复的合并键(22 + 22 - 2 - 2 = 4),或者一组4个重复的合并键,最终导致总数据多了4行。 - 可执行以下代码快速确认重复情况:
# 统计data_01中合并键重复的行数 print(data_01[['Name', 'Platform', 'Year', 'Genre', 'Publisher']].duplicated().sum()) # 统计data_02中合并键重复的行数 print(data_02[['Name', 'Platform', 'Year', 'Genre', 'Publisher']].duplicated().sum())
解决方案
可根据实际业务场景选择对应处理方式:
场景1:重复的合并键属于无效重复数据
先对两个表的合并键去重后再合并:
# 对data_01按合并键去重,keep参数可选'first'(保留第一条)、'last'(保留最后一条) data_01_dedup = data_01.drop_duplicates(subset=['Name', 'Platform', 'Year', 'Genre', 'Publisher'], keep='first') # 对data_02按合并键去重 data_02_dedup = data_02.drop_duplicates(subset=['Name', 'Platform', 'Year', 'Genre', 'Publisher'], keep='first') # 合并去重后的表 total_data = pd.merge(data_01_dedup, data_02_dedup, on=['Name', 'Platform', 'Year', 'Genre', 'Publisher'])
场景2:重复的合并键属于有效数据(比如同一款游戏的多笔销售记录)
先对两个表按合并键聚合销售数据后再合并:
# 按合并键分组,对NA_Sales求和(也可根据业务需求选均值、最大值等统计方式) data_01_agg = data_01.groupby(['Name', 'Platform', 'Year', 'Genre', 'Publisher'], as_index=False)['NA_Sales'].sum() # 按合并键分组,对EU_Sales聚合 data_02_agg = data_02.groupby(['Name', 'Platform', 'Year', 'Genre', 'Publisher'], as_index=False)['EU_Sales'].sum() # 合并聚合后的表 total_data = pd.merge(data_01_agg, data_02_agg, on=['Name', 'Platform', 'Year', 'Genre', 'Publisher'])
最简方案(确认两个表行完全一一对应仅顺序不同时使用)
直接按合并键排序后按列拼接,跳过merge逻辑,百分百保证行数一致:
# 两个表按相同规则排序后重置索引 data_01_sorted = data_01.sort_values(by=['Name', 'Platform', 'Year', 'Genre', 'Publisher']).reset_index(drop=True) data_02_sorted = data_02.sort_values(by=['Name', 'Platform', 'Year', 'Genre', 'Publisher']).reset_index(drop=True) # 直接拼接EU_Sales列 total_data = pd.concat([data_01_sorted, data_02_sorted['EU_Sales']], axis=1)
内容的提问来源于stack exchange,提问作者박진영
相关产品推荐
相关产品推荐

