Skip to content

pd.merge

pandas.merge(left, right, how="inner", on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=("_x", "_y"), copy=True, indicator=False, validate=None, _bodo_na_equal=True)

支持的参数

参数 数据类型 其他要求
left 数据框
right 数据框
how 字符串
  • 必须是 "inner", "outer", "left", "right" 之一
  • 必须在编译时为常量
on 列名称、列名称列表或通用合并条件字符串(请参见 merge-notes
  • 在编译时必须是常量
left_on 列名或列名列表
  • 在编译时必须是常量
right_on 列名或列名列表
  • 在编译时必须是常量
left_index 布尔值
  • 必须在编译时是常量
right_index 布尔值
  • 必须在编译时为常量
suffixes 字符串元组
  • 在编译时必须是常量
indicator 布尔值
  • 在编译时必须是常量
_bodo_na_equal 布尔值
  • 必须在编译时为常量
  • 该参数是Bodo特有的,不在Pandas中可用。如果为False,Bodo将不会将NA/nan键视为相等,这与Pandas不同。

重要

参数 _bodo_na_equal 是 Bodo 特有的,在 Pandas 中不可用。如果它是 False,Bodo 将不将 NA/nan 键视为相等,这与 Pandas 不同。

合并笔记

  • 输出顺序:

    输出的数据框默认情况下不排序,以获得更好的并行性能 (Pandas 可能会根据 how 保留关键顺序)。 如果需要,可以使用显式排序。

  • 一般合并条件:

    在Pandas中,pd.merge支持的合并标准仅限于一个或多个键的相等性。对于某些使用场景,这不足以满足需求,需要更广泛的支持。例如,基于这些限制,无法高效计算left outer join,其中df1.A == df2.B & df2.C < df1.A

    Bodo通过允许用户传递通用合并条件到 pd.merge 来支持这些用例。我们计划将此功能贡献给Pandas,以确保Bodo和Pandas代码的完全兼容性。

    一般合并条件通过通过 on 参数提供条件作为字符串来执行。左表中的列通过 left.{column name} 引用,右表中的列通过 right.{column name} 引用。

    这是一个演示上述内容的例子:

    >>> @bodo.jit
    ... def general_merge(df1, df2):
    ...   return df1.merge(df2, on="left.`A` == right.`B` & right.`C` < left.`A`", how="left")
    
    >>> df1 = pd.DataFrame({"col": [2, 3, 5, 1, 2, 8], "A": [4, 6, 3, 9, 9, -1]})
    >>> df2 = pd.DataFrame({"B": [1, 2, 9, 3, 2], "C": [1, 7, 2, 6, 5]})
    >>> general_merge(df1, df2)
    
       col  A     B     C
    0    2  4  <NA>  <NA>
    1    3  6  <NA>  <NA>
    2    5  3  <NA>  <NA>
    3    1  9     9     2
    4    2  9     9     2
    5    8 -1  <NA>  <NA>
    

    这些调用有一些额外的要求:

    • The condition must be constant string.
    • The condition must be of the form cond_1 & ... & cond_N where at least one cond_i is a simple equality. This restriction will be removed in a future release.
    • The columns specified in these conditions are limited to certain column types. We currently support boolean, integer, float, datetime64, timedelta64, datetime.date, and string columns.

示例用法

>>> @bodo.jit
... def f(df1, df2):
...   return pd.merge(df1, df2, how="inner", on="key")

>>> df1 = pd.DataFrame({"key": [2, 3, 5, 1, 2, 8], "A": np.array([4, 6, 3, 9, 9, -1], float)})
>>> df2 = pd.DataFrame({"key": [1, 2, 9, 3, 2], "B": np.array([1, 7, 2, 6, 5], float)})
>>> f(df1, df2)

key    A    B
0    2  4.0  7.0
1    2  4.0  5.0
2    3  6.0  6.0
3    1  9.0  1.0
4    2  9.0  7.0
5    2  9.0  5.0