pandas.DataFrame.asof#

DataFrame.asof(where, subset=None)[源代码]#

返回 where 之前的最后一行(或多行),且不包含任何 NaN。

最后一行(对于 where 中的每个元素,如果是列表)没有任何 NaN 的行将被采用。如果是 DataFrame,则只考虑列的子集(如果不是 None)的最后一行没有任何 NaN 的行。

如果没有好的值,则返回 NaN 给 Series 或返回一个包含 NaN 值的 Series 给 DataFrame

参数:
哪里日期或日期的数组类型

返回最后一行之前的日期。

subset : str 或 str 的类数组, 默认 Nonestr 或 str 的类数组,默认

对于 DataFrame,如果不是 None,则仅使用这些列来检查 NaNs。

返回:
标量, 序列, 或 数据框

返回可以是:

  • scalar : 当 self 是一个 Series 且 where 是一个标量

  • 系列:当 self 是一个 Series 且 where 是一个类数组时,或者当 self 是一个 DataFrame 且 where 是一个标量时

  • DataFrame : 当 self 是一个 DataFrame 且 where 是一个类数组时

参见

merge_asof

执行一个 asof 合并。类似于左连接。

备注

日期假定为已排序。如果不是这种情况,则引发错误。

例子

一个序列和一个标量 where

>>> s = pd.Series([1, 2, np.nan, 4], index=[10, 20, 30, 40])
>>> s
10    1.0
20    2.0
30    NaN
40    4.0
dtype: float64
>>> s.asof(20)
2.0

对于一个序列 where,会返回一个 Series。第一个值是 NaN,因为 where 的第一个元素在第一个索引值之前。

>>> s.asof([5, 20])
5     NaN
20    2.0
dtype: float64

缺失值不被考虑。以下是 2.0,不是 NaN,即使 NaN 在 30 的索引位置。

>>> s.asof(30)
2.0

考虑所有列

>>> df = pd.DataFrame(
...     {
...         "a": [10.0, 20.0, 30.0, 40.0, 50.0],
...         "b": [None, None, None, None, 500],
...     },
...     index=pd.DatetimeIndex(
...         [
...             "2018-02-27 09:01:00",
...             "2018-02-27 09:02:00",
...             "2018-02-27 09:03:00",
...             "2018-02-27 09:04:00",
...             "2018-02-27 09:05:00",
...         ]
...     ),
... )
>>> df.asof(pd.DatetimeIndex(["2018-02-27 09:03:30", "2018-02-27 09:04:30"]))
                      a   b
2018-02-27 09:03:30 NaN NaN
2018-02-27 09:04:30 NaN NaN

考虑单个列

>>> df.asof(
...     pd.DatetimeIndex(["2018-02-27 09:03:30", "2018-02-27 09:04:30"]),
...     subset=["a"],
... )
                        a   b
2018-02-27 09:03:30  30.0 NaN
2018-02-27 09:04:30  40.0 NaN