Pandas两个DataFrame取交集时pd.merge内连接结果不符合预期如何解决
Pandas 两个DataFrame取交集行数不符问题解决方案
问题根因
你得到4行输出是因为Pandas merge操作对重复匹配键会生成笛卡尔积:df1中有2条完全相同的匹配行,df2中有2条完全相同的匹配行,最终匹配结果为2*2=4行,和实际输出一致。
调整方案
方案1:新增重复行组内序号作为匹配键
该方案可以严格对齐重复行的匹配数量,最终保留的行数与df1中存在于df2的行数完全一致,适配你的需求:
import pandas as pd df1 = pd.DataFrame([ ['psy', 180, 75], ['psy', 180, 75] ], columns = ['name', 'height', 'weight']) df2 = pd.DataFrame([ ['psy', 180, 75], ['df', 160, 65], ['ddqq', 170, 75], ['psy', 180, 75] ], columns = ['name', 'height', 'weight']) # 为两个表的重复行添加组内计数作为额外匹配键 df1['dup_count'] = df1.groupby(df1.columns.tolist()).cumcount() df2['dup_count'] = df2.groupby(df2.columns.tolist()).cumcount() # 合并后删除辅助计数列 result = pd.merge(df1, df2, how='inner').drop('dup_count', axis=1) print(result)
运行输出如下:
name height weight 0 psy 180 75 1 psy 180 75
方案2:直接筛选df1中在df2存在的行
如果你不需要对齐右表重复行,只要df1的行在df2中出现过就保留,可以使用更简洁的写法:
result = df1[df1.apply(tuple, axis=1).isin(df2.apply(tuple, axis=1))] print(result)
内容的提问来源于stack exchange,提问作者YHJ
相关产品推荐
相关产品推荐

