从上次可用数据创建DataFrame的最快方法

时间:2016-04-18 20:02:39

标签: python python-3.x numpy pandas

我没有成功在论坛中寻找这个问题的答案,因为很难将其放在关键字中。任何关键字建议都受到赞赏,以便我可以让这个问题更容易理解,以便其他人可以从中受益。

我找到的最接近的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

我想创建一个像:

这样的DataFrame
Dat          col1 col2 
2015-01-01   5    4
2015-01-04   6    7
2015-01-06   8    9

就此而言,表现是一个问题。所以我正在寻找最快/最快的方法。

提前致谢。

2 个答案:

答案 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