当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python merge_asof方法用法及代码示例


Pandas merge_asof(~) 方法用于对两个 DataFrames 执行左连接,其中连接键不是通过相等而是通过邻近来匹配。

警告

左DataFrames 和右DataFrames 都必须按连接键排序。

参数

1. left | DataFrame

左侧DataFrame 执行连接。

2. right | DataFrame

用于执行连接的右侧DataFrame。

3. on | string

要加入的列的标签。该标签必须同时出现在 leftright 中。

注意

on 参数只是为了方便起见。如果要连接的列具有不同的标签,则必须使用 left_onright_onleft_indexright_index 的组合。

4. left_on | stringarray-like

left 中要执行连接的列的标签。

5. right_on | stringarray-like

right 中要执行连接的列的标签。

6. left_index | boolean | optional

是否对左侧 DataFrame 的索引执行连接。默认情况下,left_index=False

7. right_index | boolean | optional

是否对右侧 DataFrame 的索引执行连接。默认情况下,right_index=False

注意

许多教科书和文档都使用这些词合并键或者连接键表示执行连接的列。

8. by | stringlist<string> | optional

必须另外匹配才能使连接生效的列的标签。就像 on 一样,by 必须同时出现在 leftright 中。

9. left_by | string | optional

left 中要执行附加匹配的列的标签。请参阅下面的示例以进行说明。

10.right_by | string |可选的

right 中要执行附加匹配的列的标签。请参阅下面的示例以进行说明。

警告

如果指定了left_by,则也必须指定right_by,反之亦然。

11.suffixes | (string, string)tuple | optional

要附加到生成的 DataFrame 中的重复列标签的后缀名称。您还可以传递单个 None 而不是 suffixes 中的字符串,以指示左列或右列标签应保持原样。默认情况下,suffixes=("_x", "_y")

12.tolerance | intTimedelta | optional

一对连接键之间可接受的最大差异。默认情况下,tolerance=None

13.allow_exact_matches | boolean | optional

是否允许一对连接键之间的精确匹配。默认情况下,allow_exact_matches=True

14.direction | string | optional

邻近匹配的方向:

说明

"backward"

如果左连接键小于(或等于)右连接键,则匹配。

"forward"

如果左连接键大于(或等于)右连接键则匹配,

"nearest"

无论两个键的相对大小如何,都会匹配。

默认情况下,direction="backward" 。请注意,(或等于)部分取决于 allow_exact_matches

返回值

合并的 DataFrame

例子

基本用法

考虑以下两个 DataFrame:

df = pd.DataFrame({"A":[2,3,4],"B":[3,5,9]}, index=["a","b","c"])
df_other = pd.DataFrame({"B":[2,5,10],"C":[7,8,1]}, index=["d","e","f"])



   A  B   |     B   C
a  2  3   |  d  2   7
b  3  5   |  e  5   8
c  4  9   |  f  10  1

对列 B 执行连接:

pd.merge_asof(df, df_other, on="B")



   A  B  C
0  2  3  7
1  3  5  8
2  4  9  8

请注意以下事项:

  • 左侧 DataFrame 的原始列 B 出现在生成的 DataFrame 中。

  • 一对列 B 中的值不完全匹配 - [3,5,9][2,5,10]

  • 由于值 3 不存在于 right 连接键中,因此该方法会查找小于 3 ( direction="backward" ) 的最接近值,在本例中为 2C 列的对应值是 7 ,因此这就是我们在第一行看到值 7 的原因。

  • 同样,右连接键中不存在值 9 ,因此小于 9 的最接近匹配是 5 。此匹配的 C 列的相应值是 8 ,因此我们最终在右下角条目中得到 8

  • on="B" 实际上可以在这里省略,因为如果 leftright 中存在一对重叠的列标签,该方法将推断连接键。

指定left_by

考虑以下数据帧:

df = pd.DataFrame({"A":[7,9],"B":[3,5]}, index=["a","b"])
df_other = pd.DataFrame({"B":[2,5],"C":[7,8]}, index=["d","e"])



   A  B    |     B  C
a  7  3    |  d  2  7
b  9  5    |  e  5  8

默认情况下,不指定 byleft_byright_by

pd.merge_asof(df, df_other, on="B")



   A  B  C
0  7  3  7
1  9  5  8

我们可以通过允许指定列值匹配的匹配来限制匹配:

pd.merge_asof(df, df_other, on="B", left_by="A", right_by="C")



   A  B  C
0  7  3  7.0
1  9  5  NaN

请注意以下事项:

  • 第一行仍返回 7.0 值,因为 A 的列值与 C 的列值匹配(两者都是 7 )。

  • 我们在第二行得到NaN,因为A (9) 的列值与C (8) 的列值不匹配。

指定后缀

考虑以下两个 DataFrame:

df = pd.DataFrame({"A":[2,3],"B":[3,5]}, index=["a","b"])
df_other = pd.DataFrame({"B":[2,5],"A":[7,8]}, index=["d","e"])



   A  B   |     B  A
a  2  3   |  d  2  7
b  3  5   |  e  5  8

默认情况下, suffixes=("_x","_y") ,这意味着如果生成的 DataFrame 中出现重复的列标签,则 "_x" 将作为后缀附加到左侧的重叠标签,以及右侧的 "_y"

pd.merge_asof(df, df_other, on="B")



   A_x  B  A_y
0   2   3   7
1   3   5   8

我们可以像这样指定我们自己的后缀:

pd.merge_asof(df, df_other, on="B", suffixes=["_X","_Y"])



   A_X  B  A_Y
0   2   3   7
1   3   5   8

您可以传入单个 None 而不是字符串,以保留左侧或右侧重叠标签的原始名称:

pd.merge_asof(df_one, df_two, on="B", suffixes=["_X",None])



   A_X  B   A
0   2   3   7
1   3   5   8
2   4   9   8

相关用法


注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 Python | merge_asof method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。