【问题标题】:How to return index of a row 60 seconds before current row如何在当前行之前 60 秒返回行的索引
【发布时间】: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


【解决方案1】:

所以在ALollz的宝贵帮助下,我最终实现了我想做的事情,这是我的代码:

#make copy of dataframe
df2 = df[['Time_Stamp','Value']].copy()
#add Time_gap to Time_Stamp in df2
df2['Time_Stamp'] = df2.Time_Stamp +Time_gap
#sort df2 on Time_Stamp 
df2.sort_values(by = 'Time_Stamp', ascending=True,inplace = True)
df2 = df2.reset_index(drop=True)
df3 = pd.merge_asof(df, df2, on='Time_Stamp', direction='forward')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 2011-02-02
    • 1970-01-01
    • 2019-04-09
    • 2018-04-15
    • 1970-01-01
    • 2013-12-08
    • 2021-06-16
    相关资源
    最近更新 更多