合并含重复值的DataFrame时出现重复行的原因及解决方法
理解Pandas Merge重复行问题及解决方法
为什么会出现重复行?
Pandas的merge()默认执行内连接(inner join),当指定on='fruit'时,会对两个DataFrame中fruit列值匹配的行做笛卡尔积配对:
- df1里
apple仅1行,df2里apple也仅1行,配对后得到1行; - df1里
orange有2行(分别对应taste='sweet'和taste='sour'),df2里orange有2行(均为price='low'),所以df1的每一行orange都会和df2的每一行orange配对,最终得到2×2=4行——这就是重复行的来源。
如何得到期望的结果?
由于df2中同一fruit对应的price完全一致,我们可以通过以下几种方式处理:
方法1:先去重再合并
先对df2按fruit列去重,保留每个fruit的唯一记录,再执行合并:
# 对df2按fruit去重,保留首个匹配行 df2_unique = df2.drop_duplicates(subset='fruit', keep='first') # 执行合并操作 df3 = df1.merge(df2_unique, on='fruit')
执行后结果如下:
fruit taste price 0 apple sweet high 1 orange sweet low 2 orange sour low
方法2:合并后去重
若不确定df2中同一fruit的price是否一致,也可以先完成合并,再按fruit和taste组合列去重:
df3 = df1.merge(df2, on='fruit').drop_duplicates(subset=['fruit', 'taste'], keep='first')
方法3:聚合df2后合并
如果df2中同一fruit存在不同price,需要提取唯一值(如首个值、均值等),可以先聚合再合并:
# 按fruit分组,取price的首个值 df2_agg = df2.groupby('fruit')['price'].first().reset_index() df3 = df1.merge(df2_agg, on='fruit')
内容的提问来源于stack exchange,提问作者Akahs
相关产品推荐
相关产品推荐

