将Pandas DataFrame分隔成满足条件

时间:2018-05-29 16:36:03

标签: python pandas dataframe time-series

我有几个旅行的DataFrame看起来像这样:

   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

如您所见,我有位置和时间的记录,这些记录都属于某个旅行,由旅行ID识别。我还计算了delta_t作为直到行程中的条目的时间。每次旅行的最后一个条目都被指定为NaN delta_t

现在我需要确保记录的时间步长与所有数据的值相同。在这个例子中,我已经用了一个时间单位。在大多数情况下,旅行确实满足了这个条件,但我偶尔会有一个记录,例如记录号。 2,在一次精彩的旅行中,没有。

这就是为什么我想简单地将我的行程分成两次旅行。那让我陷入困境。我似乎找不到这样做的好方法。

为了考虑每次旅行,我想到的是这样的事情:

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

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

我知道这是一个非常具体的问题。我希望有人知道如何做到这一点。

我认为新的delta_t可能会被忽略,并且稍后可以轻松添加到此行(我知道这只适用于升序行程ID):

NaN

1 个答案:

答案 0 :(得分:3)

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

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

请注意,根据您的说明和数据,您似乎可以真正使用groupby,并且您可能应该查看其他操作。但是,在您要求的特定情况下,这是不必要的