代码之家  ›  专栏  ›  技术社区  ›  Jan Kaiser

将熊猫数据帧分为满足条件的行之间的部分

  •  2
  • Jan Kaiser  · 技术社区  · 7 年前

    我有几次旅行的数据框架,看起来像这样:

       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 作为其 三角洲 .

    现在,我需要确保我的记录的时间步长在所有数据中都是相同的值。对于这个例子,我使用了一个时间单位。在大多数情况下,旅行确实满足了这一条件,但偶尔我会有一个单一的记录,比如2号记录,在一次很好的旅行中,却没有。

    这就是为什么我想在这一点上把我的旅行简单地分成两次。但我还是被卡住了。我似乎找不到一个好方法来做这件事。

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

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

    然而,循环中的实际拆分是我不知道如何做的。基本上,我需要为每个条目分配一个新的旅行ID 三角洲 到下一个(或旅行结束),或进行某种分组操作,可以在这些大型 三角洲 .

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

    我觉得新的 S,这将是必要的,可以被忽略,并很容易添加到后面的这一行(我知道这只适用于上升的旅行ID):

     df.loc[df['TripID'].diff().shift(-1) > 0, 'delta_t'] = np.nan
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   sacuL    7 年前

    IIUC,不需要循环。下面创建一个名为 new_TripID 基于2个条件:原始 TripID 从一行更改到下一行,或者 time 列大于1

    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 ,您可能应该研究一下其他操作。但是,在您要求的特定情况下,这是不必要的