[英]Fastest way to create DataFrame from last available data
我很难在论坛中找到该问题的答案,因为很难将其放入关键字中。 任何关键字的建议,我们将不胜感激,以便让其他人可以从中受益。
我发现的最接近的问题并未真正回答我的问题。
我的问题如下:
我有一个称为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
我想创建一个DataFrame像这样:
Dat col1 col2
2015-01-01 5 4
2015-01-04 6 7
2015-01-06 8 9
因此,性能是一个问题。 所以我正在寻找最快/最快的方法。
提前致谢。
您可以进行外部合并,将新索引设置为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
使用np.searchsorted在之后找到索引(“正确”选项;需要正确处理相等性):
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.