删除第二个数据帧间隔中的数据帧时间戳

Posted

技术标签:

【中文标题】删除第二个数据帧间隔中的数据帧时间戳【英文标题】:Delete dataframe timestamps which are in second dataframe intervals 【发布时间】:2020-03-31 16:55:39 【问题描述】:

给定:两个数据帧的列=(id,时间戳),另一个数据帧列=(id,start_interval,end_interval),id 总是相同的。其中一个由 timetemp sec 组成,另一个只有时间戳间隔。

df_timestamp

    id      timestamp
1   11006   1365       
2   11006   1366       
3   11006   1367
4   11006   1368
5   11006   1369   
...
101 11006   1465
102 11006   1466
103 11006   1467
104 11006   1468
...

df_intervals

    id      start_interval    end_interval
1   11006   1250              1366
2   11006   1369              1455
...
12  11006   1466              1467
13  11006   1620              1950
...

任务:我需要创建新的数据框,其中 df_timestamp ['timestamp'] 值不在 df_intervals 'intervals' 值中或之间。

输出:

new_df

   id     timestamp  
1  11006  1367       
2  11006  1368 
...
77 11006  1465
78 11006  1468
...

我尝试merge() 他们,但这个 dfs 非常大。也尝试添加一些逻辑表达式并失败。合并的情况似乎有效,但需要无限时间才能运行。此外,合并后需要合适的.loc

有没有更优雅、更有效的方法来做到这一点?

【问题讨论】:

【参考方案1】:

如果我理解正确,你需要它:

crit=  df_timestamp.timestamp.isin(df_intervals.start_interval) \
     | df_timestamp.timestamp.isin(df_intervals.end_interval)

df_timestamp.loc[~crit]                                                                                              

编辑:

#For readablity:
    df_interval, df_timestamp= dfi,dft


    matched= dft.groupby( lambda idx: \
                           (  dfi.start_interval.le(dft.loc[idx,"timestamp"]) \
                            & dfi.end_interval.ge(dft.loc[idx,"timestamp"])).any() ) \
                    .groups[False]                                                                               

    Out:
       df_timestamp.loc[matched]  

index     id  timestamp
2          3  11006     1367.0
3          4  11006     1368.0
5  101 11006   1465        NaN
6  102 11006   1466        NaN
7  103 11006   1467        NaN
8  104 11006   1468        NaN

EDIT2: 先前代码的变体,具有列表理解:

dft.loc[ [(dfi.start_interval.gt(ts) | dfi.end_interval.lt(ts)).all() for ts in dft.timestamp] ]

【讨论】:

感谢您的回答,但也不能在间隔之间 参见上面的编辑代码。我想知道这个解决方案是否比您的解决方案更快或更“优雅”。

以上是关于删除第二个数据帧间隔中的数据帧时间戳的主要内容,如果未能解决你的问题,请参考以下文章

合并具有不同时间戳(不同时间间隔)的两个数据帧

将数据帧与时间戳和间隔合并

将数据帧从时间戳转换为时间间隔

将时间戳数据与另一个数据集中的最接近时间相匹配。正确矢量化?更快的方式?

验证输入火花数据帧中的时间戳以生成正确的输出火花数据帧

spark:如何在数据帧上进行 dropDuplicates,同时保持最高时间戳行 [重复]