从最后可用数据创建 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 的最快和通用方法是啥?