排序,分组,并获取特定列值的行和行+1?

Posted

技术标签:

【中文标题】排序,分组,并获取特定列值的行和行+1?【英文标题】:Sort, groupby, and get a row and row+1 for a specific column value? 【发布时间】:2019-01-14 21:06:55 【问题描述】:
        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,route_Seq 都会进行排序。

然后,我想对 Mod_trans 为“road”的行和之后的一行的每组中的“Connection_time”列的值求和。如果道路是组中的最后一个转弯,那么总和只有道路的 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')

有人可以帮我吗?

【问题讨论】:

【参考方案1】:

我们试试吧:

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】:

仍然使用与以前相同的想法,ffilllimit 限制新行,cumsumgroupby 创建子 ID

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

【讨论】:

也是答案,再次感谢。

以上是关于排序,分组,并获取特定列值的行和行+1?的主要内容,如果未能解决你的问题,请参考以下文章

如何按列值的计数进行分组并对其进行排序?

Jquery:在包含特定列值的行之后插入新行

如何按特定列值的前导整数对子数组进行排序?

MagicalRecord 获取具有行和部分的两个实体并对部分进行排序

在EXCEL中 如何用VBA查找某特定单元格并返回该单元格的行和列值?

如何将特定的行和列值乘以常数来创建新列?