排序,分组,并获取特定列值的行和行+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】:仍然使用与以前相同的想法,ffill
和 limit
限制新行,cumsum
为 groupby
创建子 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?的主要内容,如果未能解决你的问题,请参考以下文章
MagicalRecord 获取具有行和部分的两个实体并对部分进行排序