Python 删除第二个数据帧间隔中的数据帧时间戳
给定:两个数据帧的列=(id,timestamp),另一个数据帧的列=(id,start\u interval,end\u interval),id总是相同的。其中一个由timestemp每秒组成,另一个只有时间戳间隔 df_时间戳Python 删除第二个数据帧间隔中的数据帧时间戳,python,pandas,merge,timestamp,intervals,Python,Pandas,Merge,Timestamp,Intervals,给定:两个数据帧的列=(id,timestamp),另一个数据帧的列=(id,start\u interval,end\u interval),id总是相同的。其中一个由timestemp每秒组成,另一个只有时间戳间隔 df_时间戳 id timestamp 1 11006 1365 2 11006 1366 3 11006 1367 4 11006 1368 5 11006 1369 ... 101 1
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_间隔
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_interval'interval'值之内或之间
输出:
新德里
id timestamp
1 11006 1367
2 11006 1368
...
77 11006 1465
78 11006 1468
...
我试图merge()。还尝试添加一些逻辑表达式,但失败了。合并的案例似乎有效,但运行起来需要无限的时间。此外,合并后需要合适的.loc
有没有更优雅、更有效的方法呢?如果我理解正确,您需要它:
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:
prevoius代码的变体,具有列表理解:
dft.loc[ [(dfi.start_interval.gt(ts) | dfi.end_interval.lt(ts)).all() for ts in dft.timestamp] ]
如果我理解正确,您需要它:
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:
prevoius代码的变体,具有列表理解:
dft.loc[ [(dfi.start_interval.gt(ts) | dfi.end_interval.lt(ts)).all() for ts in dft.timestamp] ]
感谢您的回答,但也不能在两次间隔之间查看上面编辑的代码。我想知道这个解决方案是否比您的解决方案更快或更“优雅”。谢谢您的回答,但它也不能在间隔之间。请参阅上面编辑的代码。我想知道这个解决方案是否比你的更快或更“优雅”。