代码之家  ›  专栏  ›  技术社区  ›  UserYmY

是否为特定列值排序、分组并获取行和行+1?

  •  0
  • UserYmY  · 技术社区  · 8 年前
            C1  route_Seq   Connection_time     Mod_trans
            R1  1   10                          road
            R1  2   2                            air
            R1  3   4                            air
            R1  4   2                           road
            R1  5   3                            air
            R1  6   4                           road
            R2  1   3                           road
            R2  2   2                            air
            R3  1   1                           road
            R3  2   2                            air
    

    我想根据“c1”列的值按数据分组,并根据它们的“route_seq”进行排序。因此,对每个c1,路径序列进行排序。

    然后,我想对mod_trans为“road”的行和后面一行的每个组中的“connection_time”列的值求和。如果道路是该组中的最后一个转弯,则只计算道路的连接时间。

    所需答案:

        C1  Connection_time   Mod_trans
        R1     12  road
        R1     5  road
        R1     4  road
        R2     3  road
        R3     5  road
    

    我试过这段代码,但它没有给我连续两行的和,而是对每条“路”后的所有行进行和。

    df.set_index(['C1','Mod_trans',(df['Mod_trans'] == 'road').cumsum()]).sum(level=[0,2]).reset_index().assign(Mod_trans='road')
    

    有人能帮我吗?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Scott Boston    8 年前

    让我们试试:

    df['CumRoad'] = (df.sort_values('route_Seq')
                       .groupby('C1')
                       .apply(lambda x: (x['Mod_trans']=='road').cumsum()).values)
    
    df_out = (df.groupby(['C1','CumRoad'])
                .apply(lambda x: x.head(2)['Connection_time'].sum())
                .reset_index())
    
    print(df_out)
    

    输出:

       C1  CumRoad   0
    0  R1        1  12
    1  R1        2   5
    2  R1        3   4
    3  R2        1   5
    4  R3        1   3
    
        2
  •  3
  •   BENY    8 年前

    仍然像以前一样使用同样的想法, ffill 具有 limit 限制新行,以及 cumsum 为创建子ID groupby

    df['cumid']=df.Mod_trans.eq('road').groupby(df['C1']).cumsum()
    s=df['Mod_trans'].where(df['Mod_trans'].eq('road'))
    df['newroad']=s.groupby([df.C1,df.cumid]).ffill(limit=1)
    df['cumid']=df.Mod_trans.eq('road').groupby(df['C1']).cumsum()
    df=df.loc[df.newroad=='road',:]
    df.groupby(['C1','cumid','newroad'])['Connection_time'].sum()
    Out[285]: 
    C1  cumid  newroad
    R1  1.0    road       12
        2.0    road        5
        3.0    road        4
    R2  1.0    road        5
    R3  1.0    road        3
    Name: Connection_time, dtype: int64