DataFrame.asof(where, subset=None)
返回前最后一行(S)没有任何NaN的地方。
不带任何NaN
的最后一行(对于where,if list中的每个元素)。在a的情况下,DataFrame没有NaN
的最后一行仅考虑列的子集(如果不是None)
版本0.19.0中的新功能:适用于DataFrame
如果没有好的值,则返回一个DataFrame
的Series
或一系列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)