合并两个DataFrame后行数变为三倍的原因排查
DataFrame合并后行数异常的原因及解决方法
核心原因
合并后行数远超43行,是因为两个DataFrame的x列存在重复值。pandas.merge()默认执行内连接,会对每个相同的x值进行笛卡尔积匹配——也就是df1中每一行x=a的记录,都会和df2中所有x=a的记录两两配对,最终行数等于各重复x值的出现次数乘积之和。
验证重复值
你可以通过以下代码查看x列的重复分布:
# 统计df1中每个x值的出现次数 print(df1['x'].value_counts()) # 统计df2中每个x值的出现次数 print(df2['x'].value_counts())
结合你的数据定义,关键重复项的影响:
x=-7.5:两表各出现2次,合并后产生2×2=4行x=-6.0:两表各出现2次,合并后产生2×2=4行x=-3.4:两表各出现2次,合并后产生2×2=4行x=5.3:两表各出现9次,合并后产生9×9=81行x=6.8:两表各出现2次,合并后产生2×2=4行
将这些重复项的贡献与其余唯一x值的行数(每个对应1行)相加,结果正好是123行。
解决方法
根据你的需求(保持43行,与原始数据一一对应),推荐以下两种方案:
方案1:按索引/列直接拼接(最优)
因为你明确两表x列内容和顺序完全一致,直接按列拼接即可:
final = pd.concat([df1, df2['delta y']], axis=1)
或者用join确保基于x精准匹配:
final = df1.join(df2.set_index('x'), on='x')
方案2:去重后再合并
如果x列的重复属于数据冗余,可先对两表按x去重(根据业务逻辑选择保留规则),再执行合并:
# 保留每个x值的第一行记录 df1_clean = df1.drop_duplicates(subset='x', keep='first') df2_clean = df2.drop_duplicates(subset='x', keep='first') final = df1_clean.merge(df2_clean, on='x')
内容的提问来源于stack exchange,提问作者Peter M
相关产品推荐
相关产品推荐

