我没有成功在论坛中寻找这个问题的答案,因为很难将其放在关键字中。任何关键字建议都受到赞赏,以便我可以让这个问题更容易理解,以便其他人可以从中受益。
我找到的最接近的question并没有真正回答我的。
我的问题如下:
我有一个名为ref
的DataFrame,以及一个名为pub
的日期列表。 ref
包含索引的日期,但这些日期与pub
中的日期不同(会有一些匹配的值)。我想创建一个新的DataFrame,其中包含pub
中的所有日期,但请填充ref
中的“最后可用数据”。
因此,说ref
是:
Dat col1 col2
2015-01-01 5 4
2015-01-02 6 7
2015-01-05 8 9
pub
2015-01-01
2015-01-04
2015-01-06
我想创建一个像:
这样的DataFrameDat col1 col2
2015-01-01 5 4
2015-01-04 6 7
2015-01-06 8 9
就此而言,表现是一个问题。所以我正在寻找最快/最快的方法。
提前致谢。
答案 0 :(得分:2)
您可以执行外部合并,将新索引设置为Dat
,对其进行排序,转发填充,然后根据pub
中的日期重新编制索引。
dates = ['2015-01-01', '2015-01-04', '2015-01-06']
pub = pd.DataFrame([dt.datetime.strptime(ts, '%Y-%m-%d').date() for ts in dates],
columns=['Dat'])
>>> (ref
.merge(pub, on='Dat', how='outer')
.set_index('Dat')
.sort_index()
.ffill()
.reindex(pub.Dat))
col1 col2
Dat
2015-01-01 5 4
2015-01-04 6 7
2015-01-06 8 9
答案 1 :(得分:2)
使用np.searchsorted查找紧随其后的indice('right'选项;需要正确处理相等):
In [27]: pub = ['2015-01-01', '2015-01-04', '2015-01-06']
In [28]: df
Out[28]:
col1 col2
Dat
2015-01-01 5 4
2015-01-02 6 7
2015-01-05 8 9
In [29]: y=np.searchsorted(list(df.index),pub,'right')
#array([1, 2, 3], dtype=int64)
然后重建:
In [30]: pd.DataFrame(df.iloc[y-1].values,index=pub)
Out[30]:
0 1
2015-01-01 5 4
2015-01-04 6 7
2015-01-06 8 9