You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:40:43