我希望能够同步两个非常长的数据框,性能在这种情况下非常关键。这两个数据框按照时间顺序进行索引(这应该被充分利用以尽可能快地完成同步),使用datetimes或Timestamps。
以下是一个同步的示例:
import pandas as pd
df1=pd.DataFrame({'A':[1,2,3,4,5,6], 'B':[1,5,3,4,5,7]}, index=pd.date_range('20140101 101501', freq='u', periods=6))
df2=pd.DataFrame({'D':[10,2,30,4,5,10], 'F':[1,5,3,4,5,70]}, index=pd.date_range('20140101 101501.000003', freq='u', periods=6))
# synch data frames
df3=df1.merge(df2, how='outer', right_index=True, left_index=True).fillna(method='ffill')
我的问题是这是否是最有效的方法?如果有更快的方法来解决这个任务,我准备探索其他解决方案(例如使用numpy或cython)。
谢谢
注:时间戳通常不是等间隔的(如上面的示例),该方法也应适用于此情况。
阅读答案后的评论:
我认为在许多用例中,对齐、合并或连接都没有帮助。关键是不要使用与数据库相关的语义来对齐(我认为对于时间序列来说不那么相关)。对我来说,对齐意味着将系列A映射到B,并有一种处理缺失值的方法(通常是采样和保持方法),对齐和连接会导致不想要的效果,例如加入时重复出现了几个时间戳。我仍然没有完美的解决方案,但似乎np.searchsorted可以帮助解决问题(它比使用多次调用join / align做我需要做的事情要快得多)。到目前为止,我还没有找到一种pandas方式来做到这一点。
如何将A映射到B,以便结果具有A和B的所有时间戳,但没有重复项(除了已经存在于A和B中的重复项)?
另一个典型用例是采样保持同步,可以通过以下有效方式解决(将A与B同步,即在A的每个时间戳中取相应的B值:
idx=np.searchsorted(B.index.values, A.index.values, side='right')-1
df=A.copy()
for i in B:
df[i]=B[i].ix[idx].values
结果 df 包含 A 的相同索引和 B 中同步的值。
在 Pandas 中有没有直接执行此操作的有效方法?
join
方法,但我没有测试过它是否更快。大部分的pandas代码已经被cython化了,所以我认为你不会能够显著提高所需的时间。 - Midnighter