【问题标题】:Separate Pandas DataFrame into sections between rows that satisfy a condition将 Pandas DataFrame 分成满足条件的行之间的部分
【发布时间】:2018-11-08 09:20:13
【问题描述】:

我有几个行程的 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,或者进行某种分组操作,可以在这些大 delta_t 之间进行分组。

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

我认为新的NaNs,然后是需要的,一开始可以忽略,以后可以很容易地用这一行添加(我知道它只适用于升序旅行 ID):

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

【问题讨论】:

  • 我不确定我是否了解您想要做什么,但是:df.groupby('TripID')['delta_t'].eq(df['delta_t'].shift()) 可能会完成这项工作?
  • 请使用发布的样本显示所需的结果。这通常比文字更能说明问题。

标签: python pandas dataframe time-series


【解决方案1】:

IIUC,不需要循环。以下基于 2 个条件创建一个名为 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

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

【讨论】:

  • 非常感谢,太完美了!没想到会有这么优雅的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 2020-12-22
  • 2022-01-14
  • 2020-01-16
  • 1970-01-01
相关资源
最近更新 更多