Python中pandas的left join方法为什么会增加原有数据的行?

我用 pandas 的 join 方法拼接数据,代码如下

package_item_df = package_item_df.join(res_df, on=[‘whistler_order_id’, ‘order_item_id’, ‘order_item_sn’])

结果拼完以后 package_item_df 的行数增加了,

join 默认是 left join,

应该是以调用 join 的 dataframe 数据为准,为什么会改变原有 dataframe 的行数?
Python中pandas的left join方法为什么会增加原有数据的行?


4 回复

有没有可能是 join 的 data 里面的列不唯一,也就是 package_item_df 里面有些一行数据对应了右边表多条数据,这样出来可能会增加行数。


问题分析:
left join 本身不会增加左表的行数,但如果你发现行数变多,通常是因为左表的“连接键”有重复值,而右表对应这些键也有多条匹配记录。这样,左表的每一行会与右表所有匹配行组合,导致结果行数膨胀。

核心原因:
假设左表有一行键为 A,右表有两行键也为 Aleft join 后左表的这一行会变成两行(分别匹配右表的两条记录)。如果左表本身键唯一,但右表有重复键,也会出现类似情况。

代码示例:

import pandas as pd

# 左表:有一行键为 'A'
left = pd.DataFrame({'key': ['A', 'B'], 'value_left': [1, 2]})
# 右表:有两行键为 'A'
right = pd.DataFrame({'key': ['A', 'A'], 'value_right': [10, 20]})

# left join
result = pd.merge(left, right, on='key', how='left')
print("左表:\n", left)
print("右表:\n", right)
print("合并结果:\n", result)
print("左表行数:", len(left))
print("结果行数:", len(result))

输出:

左表:
   key  value_left
0   A           1
1   B           2
右表:
   key  value_right
0   A           10
1   A           20
合并结果:
   key  value_left  value_right
0   A           1         10.0
1   A           1         20.0
2   B           2          NaN
左表行数: 2
结果行数: 3  # 行数增加了

解决方法:

  1. 检查左表连接键是否有重复:left['key'].duplicated().any()
  2. 检查右表连接键的重复情况:right['key'].value_counts()
  3. 如果不需要多对多匹配,可以先对右表去重(例如取第一条):
    right_unique = right.drop_duplicates(subset='key')
    result = pd.merge(left, right_unique, on='key', how='left')
    

一句话总结: 检查左右表连接键的重复值,这是行数增加的常见原因。

pandas 中的df.join并不是对等于关系型数据库中的 join, 而是把两个 DF 拼起来。how 参数只是制定了拼起来的结果使用哪边的index

可能楼主想要的功能是df.merge.
df.join: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.join.html
df.merge: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html
还有这个: https://pandas.pydata.org/pandas-docs/stable/merging.html

多谢,真是这样。先对右面做聚合就好了

回到顶部