Pandas merge_asof(~) 方法用于对两个 DataFrames 执行左连接,其中连接键不是通过相等而是通过邻近来匹配。
警告
左DataFrames 和右DataFrames 都必须按连接键排序。
参数
1. left | DataFrame
左侧DataFrame 执行连接。
2. right | DataFrame
用于执行连接的右侧DataFrame。
3. on | string
要加入的列的标签。该标签必须同时出现在 left 和 right 中。
注意
on 参数只是为了方便起见。如果要连接的列具有不同的标签,则必须使用 left_on 、 right_on 、 left_index 或 right_index 的组合。
4. left_on | string 或 array-like
left 中要执行连接的列的标签。
5. right_on | string 或 array-like
right 中要执行连接的列的标签。
6. left_index | boolean | optional
是否对左侧 DataFrame 的索引执行连接。默认情况下,left_index=False 。
7. right_index | boolean | optional
是否对右侧 DataFrame 的索引执行连接。默认情况下,right_index=False 。
注意
许多教科书和文档都使用这些词合并键或者连接键表示执行连接的列。
8. by | string 或 list<string> | optional
必须另外匹配才能使连接生效的列的标签。就像 on 一样,by 必须同时出现在 left 和 right 中。
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 | int 或 Timedelta | optional
一对连接键之间可接受的最大差异。默认情况下,tolerance=None 。
13.allow_exact_matches | boolean | optional
是否允许一对连接键之间的精确匹配。默认情况下,allow_exact_matches=True 。
14.direction | string | optional
邻近匹配的方向:
|
值 |
说明 |
|---|---|
|
|
如果左连接键小于(或等于)右连接键,则匹配。 |
|
|
如果左连接键大于(或等于)右连接键则匹配, |
|
|
无论两个键的相对大小如何,都会匹配。 |
默认情况下,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") 的最接近值,在本例中为2。C列的对应值是7,因此这就是我们在第一行看到值7的原因。 -
同样,右连接键中不存在值
9,因此小于9的最接近匹配是5。此匹配的C列的相应值是8,因此我们最终在右下角条目中得到8。 -
on="B"实际上可以在这里省略,因为如果left和right中存在一对重叠的列标签,该方法将推断连接键。
指定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
默认情况下,不指定 by 、 left_by 或 right_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
相关用法
- Python Pandas merge_ordered方法用法及代码示例
- Python NumPy mean方法用法及代码示例
- Python NumPy meshgrid方法用法及代码示例
- Python statistics median_high()用法及代码示例
- Python statistics median()用法及代码示例
- Python memoryview.itemsize用法及代码示例
- Python memoryview.nbytes用法及代码示例
- Python memoryview.cast用法及代码示例
- Python memoryview.obj用法及代码示例
- Python memoryview.hex用法及代码示例
- Python memoryview()用法及代码示例
- Python memoryview.toreadonly用法及代码示例
- Python NumPy median方法用法及代码示例
- Python statistics median_low()用法及代码示例
- Python memoryview用法及代码示例
- Python memoryview.release用法及代码示例
- Python memoryview.tolist用法及代码示例
- Python memoryview.__eq__用法及代码示例
- Python statistics median_grouped()用法及代码示例
- Python memoryview.tobytes用法及代码示例
- Python mxnet.symbol.op.broadcast_logical_xor用法及代码示例
- Python matplotlib.patheffects.withTickedStroke用法及代码示例
- Python mxnet.test_utils.get_zip_data用法及代码示例
- Python mxnet.ndarray.op.uniform用法及代码示例
- Python mxnet.symbol.op.log_softmax用法及代码示例
注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 Python | merge_asof method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
