【发布时间】:2020-05-05 08:11:06
【问题描述】:
我有一个大的(>32 M 行)Pandas 数据框。 在“Time_Stamp”列中,我有一个以秒为单位的 Unix 时间戳。这些值不是线性的,存在间隙,并且某些时间戳可以重复(例如:1、2、4、6、6、9,...)。 我想将当前行的“结果”列设置为当前行之前 60 秒的行的索引(如果在当前行之前正好 60 秒没有行,则最接近的匹配,如果有多个匹配,则取最大值所有匹配项)。
我已经尝试过首先获取索引列表,但它总是返回一个空列表:
df.index[df['Time_Stamp'] <= df.Time_Stamp-60].tolist()
由于行数过多,我无法使用 for 循环。
编辑 20.01.2020: 根据下面的评论,我添加了一个示例数据集,而不是返回索引,我想返回列值:
In [2]: df
Out[2]:
Time_Stamp Value
0 1 2.4
1 2 3.1
2 4 6.3
3 6 7.2
4 6 6.1
5 9 6.0
【问题讨论】:
-
查看
pd.merge_asof。保留原件并制作 DataFrame 的副本。从副本的“时间戳”列中减去 60 秒,然后在原始和副本之间进行asof合并将找到过去 60 秒的最近行(如果您想要更近或更远,请设置一个方向没有完全匹配)。如果您想要在平局的情况下达到最大值,那么您应该在合并之前按['Timestamp', 'Result'], ascending=[False, False]对复制的数据帧进行排序 -
太棒了!合并 32M 行大约需要 5 秒。 Pandas 数据框令人印象深刻。如何将此标记为答案?还是我应该自己回答并参考您的评论?
-
非常高兴它解决了您的问题!我没有提供解决方案的唯一原因是没有样本数据,而且通常没有样本数据和预期输出,尝试的解决方案达不到要求。如果您想创建一些示例数据,例如仅几行(请参阅stackoverflow.com/questions/20109391/…)并将其添加到您的问题中,那么我很乐意填写答案。
-
另外,如果您打算花时间改进问题,您可以用所学知识回答您自己的问题。我非常乐意为好的问题和解决方案投票:D。
-
给出的示例数据框的预期输出是什么?
标签: python-3.x pandas dataframe