在满足某个条件的行之间,将数据帧分隔为多个部分

2024-04-27 01:02:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个旅行的数据帧,看起来像这样:

   TripID  Lat    Lon    time  delta_t
0  1       53.55  9.99   74    1
1  1       53.58  9.99   75    1
2  1       53.60  9.98   76    5
3  1       53.60  9.98   81    1
4  1       53.58  9.99   82    1
5  1       53.59  9.97   83    NaN
6  2       52.01  10.04  64    1
7  2       52.34  10.05  65    1
8  2       52.33  10.07  66    NaN

如您所见,我有位置和时间的记录,它们都属于某个trip,由trip ID标识。我还计算了delta_t作为直到trip中后面的条目为止的时间。每个trip的最后一个条目被分配NaN作为它的delta_t。你知道吗

现在我需要确保记录的时间步长在所有数据中都是相同的值。对于这个例子,我用了一个时间单位。在大多数情况下,旅行确实满足了这个条件,但我偶尔会有一个记录,比如2号记录,在一次其他方面都不错的旅行中,那就不符合了

这就是为什么我想简单地把我的旅行分成两次。但我还是被卡住了。我似乎找不到一个好办法。你知道吗

考虑到每一次旅行本身,我想到了这样的事情:

 for key, grp in df.groupby('TripID'): 
     # split trip at too long delta_t(s)

然而,循环中的实际分裂是我不知道怎么做的。基本上,我需要为从一个大的delta_t到下一个(或旅行结束时)的每个条目分配一个新的旅行ID,或者进行某种分组操作,在这些大的delta_t之间进行分组。你知道吗

我知道这是一个非常具体的问题。我希望有人知道怎么做。你知道吗

我认为新的NaN一开始可以忽略,以后可以很容易地添加到这一行(我知道它只适用于升序trip id):

 df.loc[df['TripID'].diff().shift(-1) > 0, 'delta_t'] = np.nan

Tags: 数据iddftime记录时间条目nan
1条回答
网友
1楼 · 发布于 2024-04-27 01:02:20

IIUC,不需要循环。下面根据两个条件创建一个名为new_TripID的新列:原始TripID从一行更改到下一行,或者time列中的差异大于一行

df['new_TripID'] = ((df['TripID'] != df['TripID'].shift()) | (df.time.diff() > 1)).cumsum()

>>> df
   TripID    Lat    Lon  time  delta_t  new_TripID
0       1  53.55   9.99    74      1.0           1
1       1  53.58   9.99    75      1.0           1
2       1  53.60   9.98    76      5.0           1
3       1  53.60   9.98    81      1.0           2
4       1  53.58   9.99    82      1.0           2
5       1  53.59   9.97    83      NaN           2
6       2  52.01  10.04    64      1.0           3
7       2  52.34  10.05    65      1.0           3
8       2  52.33  10.07    66      NaN           3

请注意,从您的描述和数据来看,您似乎真的可以使用^{},您可能应该研究它以进行其他操作。然而,在你要求的特殊情况下,这是不必要的

相关问题 更多 >