pandas:使用ffill/bfill/来自另一个索引的最接近值从索引的系列

u3r8eeie  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(120)

假设我有一个日期时间索引idx1

['2023-06-02',
'2023-06-04',
'2023-06-06',
'2023-06-08',
'2023-06-10',
'2023-06-12']

idx2

['2023-06-03',
'2023-06-08']

我想构造一个以idx1作为索引的序列,值是与idx2最近的索引值,所以:

2023-06-02    '2023-06-03'
2023-06-04    '2023-06-03'
2023-06-06    '2023-06-08'
2023-06-08    '2023-06-08'
2023-06-10    '2023-06-08'
2023-06-12    '2023-06-08'

或例如bfill:

2023-06-02             NaN
2023-06-04    '2023-06-03'
2023-06-06    '2023-06-03'
2023-06-08    '2023-06-08'
2023-06-10    '2023-06-08'
2023-06-12    '2023-06-08'

或填充:

2023-06-02    '2023-06-03'
2023-06-04    '2023-06-08'
2023-06-06    '2023-06-08'
2023-06-08    '2023-06-08'
2023-06-10             NaN
2023-06-12             NaN

基本上是pandas.Series.reindex中的任何可用选项。
我该如何构建这样一个系列?
类似的问题对于其他索引数据类型,如数字索引等.

e3bfsja2

e3bfsja21#

下面是一种使用pd.merge_asofnumeric 索引的方法:
1.将索引转换为系列(pd.Index.to_series)并添加名称(Series.rename)。
1.使用pd.merge_asof,合并索引并将direction参数设置为所需的值,然后选择列s2(即idx2的值)。
使用列表理解:

s1 = idx1.to_series().rename('s1')
s2 = idx2.to_series().rename('s2')

nearest, bfill, ffill = [(pd.merge_asof(s1, s2, 
                                        direction=direction, 
                                        left_index=True, 
                                        right_index=True)['s2']) 
                         for direction in ['nearest','backward','forward']]

图纸:

nearest

2023-06-02   2023-06-03
2023-06-04   2023-06-03
2023-06-06   2023-06-08
2023-06-08   2023-06-08
2023-06-10   2023-06-08
2023-06-12   2023-06-08
Name: s2, dtype: datetime64[ns]

bfill

2023-06-02          NaT
2023-06-04   2023-06-03
2023-06-06   2023-06-03
2023-06-08   2023-06-08
2023-06-10   2023-06-08
2023-06-12   2023-06-08
Name: s2, dtype: datetime64[ns]

ffill

2023-06-02   2023-06-03
2023-06-04   2023-06-08
2023-06-06   2023-06-08
2023-06-08   2023-06-08
2023-06-10          NaT
2023-06-12          NaT
Name: s2, dtype: datetime64[ns]

请注意文档中的以下声明(原件大写):
数据必须有序。此外,这必须是一个数字列,如datetimelike、integer或float。

相关问题