Python pandas.DataFrame.asof函数方法的使用

DataFrame.asof 是 pandas 中的一个函数,它返回给定索引之前的最后一行(无 NaN)的数据。它通常用于查找某个时间或索引之前最近的非 NaN 值。本文主要介绍一下Pandas中pandas.DataFrame.asof方法的使用。

DataFrame.asof(where, subset=None)

返回前最后一行(S)没有任何NaN的地方。

不带任何NaN的最后一行(对于where,if list中的每个元素)。在a的情况下,DataFrame没有NaN的最后一行仅考虑列的子集(如果不是None)

版本0.19.0中的新功能:适用于DataFrame

如果没有好的值,则返回一个DataFrameSeries或一系列NaN值的NaN

参数

where : 日期或数组的日期

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

subset : str或str-array,默认为None

对于DataFrame,如果不是None,

则仅使用这些列来检查NaN。

返回

scalar, Series, or DataFrame

scalar:当自我是一个Series而在哪里是一个标量

Series:当自为Series并且其中为阵列状时,

或当自是一个DataFrame,并在那里是scalar

DataFrame:当self是DataFrame时,where是类似数组的

例子,

1)单个索引

查找 2023-01-04 之前的最后一个有效值:

import pandas as pd
import numpy as np

# 示例 DataFrame
data = {
    'A': [1, 2, np.nan, 4, 5, np.nan, 7],
    'B': [np.nan, 2, 3, np.nan, 5, 6, np.nan],
    'C': [1, np.nan, 3, 4, np.nan, 6, 7]
}
df = pd.DataFrame(data, index=pd.date_range('2023-01-01', periods=7))

print("原始 DataFrame:")
print(df)
result = df.asof(pd.Timestamp('2023-01-04'))
print("\n截至 2023-01-04 的最后有效值:")
print(result)

2)索引列表

查找多个日期之前的最后有效值:

import pandas as pd
import numpy as np

# 示例 DataFrame
data = {
    'A': [1, 2, np.nan, 4, 5, np.nan, 7],
    'B': [np.nan, 2, 3, np.nan, 5, 6, np.nan],
    'C': [1, np.nan, 3, 4, np.nan, 6, 7]
}
df = pd.DataFrame(data, 
index=pd.date_range('2023-01-01', periods=7))

print("原始 DataFrame:")
print(df)

result = df.asof([pd.Timestamp('2023-01-02'),
pd.Timestamp('2023-01-04'), 
pd.Timestamp('2023-01-06')])
print("\n截至指定日期的最后有效值:")
print(result)

3)使用示例

import pandas as pd
import numpy as np

# 创建一个 Series
s = pd.Series([1, 2, np.nan, 4], index=[10, 20, 30, 40])
print("原始 Series:")
print(s)

# 使用 asof 查找指定索引之前的最后一个有效值
result_scalar = s.asof(20)
print("\n截至索引 20 的最后有效值:")
print(result_scalar)

# 对于一个 Series,使用 asof 返回一个 Series。
# 第一个值是 NaN,
# 因为 where 的第一个元素在第一个索引值之前
result_series = s.asof([5, 20])
print("\n截至指定索引的最后有效值 (Series):")
print(result_series)

# 即使在索引位置 30 处有 NaN,
# asof 也会忽略缺失值并返回 2.0 而不是 NaN
result_scalar_nan = s.asof(30)
print("\n截至索引 30 的最后有效值(忽略 NaN):")
print(result_scalar_nan)

# 创建一个 DataFrame
df = pd.DataFrame({'a': [10, 20, 30, 40, 50],
                   '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']))
print("\n原始 DataFrame:")
print(df)

# 考虑所有列,使用 asof 查找指定时间之前的最后一个有效值
result_df_all = df.asof(pd.DatetimeIndex(
  ['2018-02-27 09:03:30', 
  '2018-02-27 09:04:30']))
print("\n截至指定时间的最后有效值 (所有列):")
print(result_df_all)

# 考虑单个列
result_df_subset = df.asof(pd.DatetimeIndex(
  ['2018-02-27 09:03:30', 
  '2018-02-27 09:04:30']), subset=['a'])
print("\n截至指定时间的最后有效值 (单列 'a'):")
print(result_df_subset)

推荐阅读
cjavapy编程之路首页