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


Python pandas.merge_asof用法及代码示例


用法:

pandas.merge_asof(left, right, on=None, left_on=None, right_on=None, left_index=False, right_index=False, by=None, left_by=None, right_by=None, suffixes=('_x', '_y'), tolerance=None, allow_exact_matches=True, direction='backward')

按关键距离执行合并。

这类似于left-join,除了我们匹配最近的键而不是相等的键。两个 DataFrame 都必须按 key 排序。

对于左侧 DataFrame 中的每一行:

  • A “backward” search selects the last row in the right DataFrame whose ‘on’ key is less than or equal to the left’s key.

  • A “forward” search selects the first row in the right DataFrame whose ‘on’ key is greater than or equal to the left’s key.

  • A “nearest” search selects the row in the right DataFrame whose ‘on’ key is closest in absolute distance to the left’s key.

默认为“backward”,兼容0.20.0以下的版本。在 0.20.0 版本中添加了方向参数,并引入了“forward” and “nearest”。

在使用 ‘on’ 搜索之前,可选择使用 ‘by’ 匹配等效键。

参数

leftDataFrame 或命名系列
rightDataFrame 或命名系列
on标签

要加入的字段名称。必须在两个 DataFrame 中都可以找到。数据必须是有序的。此外,这必须是数字列,例如 datetimelike、integer 或 float。必须给出 On 或 left_on/right_on。

left_on标签

在左侧 DataFrame 中加入的字段名称。

right_on标签

要在右侧 DataFrame 中加入的字段名称。

left_indexbool

使用左侧 DataFrame 的索引作为连接键。

right_indexbool

使用正确 DataFrame 的索引作为连接键。

by列名或列名列表

在执行合并操作之前匹配这些列。

left_by列名

左侧 DataFrame 中要匹配的字段名称。

right_by列名

要在右侧 DataFrame 中匹配的字段名称。

suffixes2 长度序列(元组,列表,...)

分别应用于左侧和右侧重叠列名的后缀。

toleranceint 或 Timedelta,可选,默认无

在此范围内选择asof公差;必须与合并索引兼容。

allow_exact_matches布尔值,默认为真
  • 如果为 True,则允许匹配相同的 ‘on’ 值(即 less-than-or-equal-to /greater-than-or-equal-to)

  • 如果为 False,则不匹配相同的 ‘on’ 值(即严格 less-than /严格 greater-than)。

direction‘backward’(默认),‘forward’, or ‘nearest’

是否搜索先前、后续或最接近的匹配项。

返回

merged DataFrame

例子

>>> left = pd.DataFrame({"a":[1, 5, 10], "left_val":["a", "b", "c"]})
>>> left
    a left_val
0   1        a
1   5        b
2  10        c
>>> right = pd.DataFrame({"a":[1, 2, 3, 6, 7], "right_val":[1, 2, 3, 6, 7]})
>>> right
   a  right_val
0  1          1
1  2          2
2  3          3
3  6          6
4  7          7
>>> pd.merge_asof(left, right, on="a")
    a left_val  right_val
0   1        a          1
1   5        b          3
2  10        c          7
>>> pd.merge_asof(left, right, on="a", allow_exact_matches=False)
    a left_val  right_val
0   1        a        NaN
1   5        b        3.0
2  10        c        7.0
>>> pd.merge_asof(left, right, on="a", direction="forward")
    a left_val  right_val
0   1        a        1.0
1   5        b        6.0
2  10        c        NaN
>>> pd.merge_asof(left, right, on="a", direction="nearest")
    a left_val  right_val
0   1        a          1
1   5        b          6
2  10        c          7

我们也可以使用索引数据帧。

>>> left = pd.DataFrame({"left_val":["a", "b", "c"]}, index=[1, 5, 10])
>>> left
   left_val
1         a
5         b
10        c
>>> right = pd.DataFrame({"right_val":[1, 2, 3, 6, 7]}, index=[1, 2, 3, 6, 7])
>>> right
   right_val
1          1
2          2
3          3
6          6
7          7
>>> pd.merge_asof(left, right, left_index=True, right_index=True)
   left_val  right_val
1         a          1
5         b          3
10        c          7

这是一个 real-world times-series 示例

>>> quotes = pd.DataFrame(
...     {
...         "time":[
...             pd.Timestamp("2016-05-25 13:30:00.023"),
...             pd.Timestamp("2016-05-25 13:30:00.023"),
...             pd.Timestamp("2016-05-25 13:30:00.030"),
...             pd.Timestamp("2016-05-25 13:30:00.041"),
...             pd.Timestamp("2016-05-25 13:30:00.048"),
...             pd.Timestamp("2016-05-25 13:30:00.049"),
...             pd.Timestamp("2016-05-25 13:30:00.072"),
...             pd.Timestamp("2016-05-25 13:30:00.075")
...         ],
...         "ticker":[
...                "GOOG",
...                "MSFT",
...                "MSFT",
...                "MSFT",
...                "GOOG",
...                "AAPL",
...                "GOOG",
...                "MSFT"
...            ],
...            "bid":[720.50, 51.95, 51.97, 51.99, 720.50, 97.99, 720.50, 52.01],
...            "ask":[720.93, 51.96, 51.98, 52.00, 720.93, 98.01, 720.88, 52.03]
...     }
... )
>>> quotes
                     time ticker     bid     ask
0 2016-05-25 13:30:00.023   GOOG  720.50  720.93
1 2016-05-25 13:30:00.023   MSFT   51.95   51.96
2 2016-05-25 13:30:00.030   MSFT   51.97   51.98
3 2016-05-25 13:30:00.041   MSFT   51.99   52.00
4 2016-05-25 13:30:00.048   GOOG  720.50  720.93
5 2016-05-25 13:30:00.049   AAPL   97.99   98.01
6 2016-05-25 13:30:00.072   GOOG  720.50  720.88
7 2016-05-25 13:30:00.075   MSFT   52.01   52.03
>>> trades = pd.DataFrame(
...        {
...            "time":[
...                pd.Timestamp("2016-05-25 13:30:00.023"),
...                pd.Timestamp("2016-05-25 13:30:00.038"),
...                pd.Timestamp("2016-05-25 13:30:00.048"),
...                pd.Timestamp("2016-05-25 13:30:00.048"),
...                pd.Timestamp("2016-05-25 13:30:00.048")
...            ],
...            "ticker":["MSFT", "MSFT", "GOOG", "GOOG", "AAPL"],
...            "price":[51.95, 51.95, 720.77, 720.92, 98.0],
...            "quantity":[75, 155, 100, 100, 100]
...        }
...    )
>>> trades
                     time ticker   price  quantity
0 2016-05-25 13:30:00.023   MSFT   51.95        75
1 2016-05-25 13:30:00.038   MSFT   51.95       155
2 2016-05-25 13:30:00.048   GOOG  720.77       100
3 2016-05-25 13:30:00.048   GOOG  720.92       100
4 2016-05-25 13:30:00.048   AAPL   98.00       100

默认情况下,我们采用引号的 asof

>>> pd.merge_asof(trades, quotes, on="time", by="ticker")
                     time ticker   price  quantity     bid     ask
0 2016-05-25 13:30:00.023   MSFT   51.95        75   51.95   51.96
1 2016-05-25 13:30:00.038   MSFT   51.95       155   51.97   51.98
2 2016-05-25 13:30:00.048   GOOG  720.77       100  720.50  720.93
3 2016-05-25 13:30:00.048   GOOG  720.92       100  720.50  720.93
4 2016-05-25 13:30:00.048   AAPL   98.00       100     NaN     NaN

我们仅在引号时间和交易时间之间的 2 毫秒内完成

>>> pd.merge_asof(
...     trades, quotes, on="time", by="ticker", tolerance=pd.Timedelta("2ms")
... )
                     time ticker   price  quantity     bid     ask
0 2016-05-25 13:30:00.023   MSFT   51.95        75   51.95   51.96
1 2016-05-25 13:30:00.038   MSFT   51.95       155     NaN     NaN
2 2016-05-25 13:30:00.048   GOOG  720.77       100  720.50  720.93
3 2016-05-25 13:30:00.048   GOOG  720.92       100  720.50  720.93
4 2016-05-25 13:30:00.048   AAPL   98.00       100     NaN     NaN

我们仅在引号时间和交易时间之间的 10 毫秒内截止,并且我们排除了准时的完全匹配。然而,先前的数据将向前传播

>>> pd.merge_asof(
...     trades,
...     quotes,
...     on="time",
...     by="ticker",
...     tolerance=pd.Timedelta("10ms"),
...     allow_exact_matches=False
... )
                     time ticker   price  quantity     bid     ask
0 2016-05-25 13:30:00.023   MSFT   51.95        75     NaN     NaN
1 2016-05-25 13:30:00.038   MSFT   51.95       155   51.97   51.98
2 2016-05-25 13:30:00.048   GOOG  720.77       100     NaN     NaN
3 2016-05-25 13:30:00.048   GOOG  720.92       100     NaN     NaN
4 2016-05-25 13:30:00.048   AAPL   98.00       100     NaN     NaN

相关用法


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