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

Posted

技术标签:

【中文标题】从最后可用数据创建 DataFrame 的最快方法【英文标题】:Fastest way to create DataFrame from last available data 【发布时间】:2016-04-18 20:02:38 【问题描述】:

我在论坛中寻找这个问题的答案没有成功,因为很难把它放在关键字中。感谢任何关键字建议,以便我可以使这个问题更易于访问,以便其他人可以从中受益。

我找到的最接近的question 并没有真正回答我的问题。

我的问题如下:

我有一个名为ref 的DataFrame,还有一个名为pub 的日期列表。 ref 有索引日期,但这些日期与pub 中的日期不同(会有一些匹配值)。我想创建一个包含 pub 的所有日期的新 DataFrame,但用 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 列中的 vlaue 替换为 pub 列表? 【参考方案1】:

您可以进行外部合并,将新索引设置为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

【讨论】:

嗨,亚历山大,感谢您的帮助。但理想情况下,我希望第二行显示 6 和 7 而不是 8 和 9。这可能吗? 应该是。你的日期是什么类型的?时间戳、python 日期时间对象还是字符串?【参考方案2】:

使用 np.searchsorted 查找紧随其后的索引('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

【讨论】:

我想这个解决方案应该更快 - 你可以在你的答案中添加一个timeit 比较吗?

以上是关于从最后可用数据创建 DataFrame 的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

使用不同格式(csv、json、avro)将数据加载到 pd.DataFrame 的最快方法

扁平化深度嵌套的 JSON 以获取 Dataframe 的最快和通用方法是啥?

从多个文件中读取大数据并在python中聚合数据的最快方法是啥?

迭代 Pandas DataFrame 并插入行的最快方法

过滤熊猫数据框中值的最快方法

在 Pandas DataFrame 中删除重复索引的最快方法 [重复]