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 |
字符串 |
|
on |
列名称、列名称列表或通用合并条件字符串(请参见 merge-notes) |
|
left_on |
列名或列名列表 |
|
right_on |
列名或列名列表 |
|
left_index |
布尔值 |
|
right_index |
布尔值 |
|
suffixes |
字符串元组 |
|
indicator |
布尔值 |
|
_bodo_na_equal |
布尔值 |
|
重要
参数 _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_Nwhere at least onecond_iis 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, andstringcolumns.
示例用法¶
>>> @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