首页 > 解决方案 > 你如何与熊猫进行分组,它对同一列中的值求和但被一组行数偏移

问题描述

我有一张如下表所示的表格。我想按 id、start_time 和方法进行分组,这样我就可以为每个类似的时间戳添加右转、直通、左转和掉头。

交集_id 开始时间 方法 移动 体积
799028 中午 12:00:00 南行 正确的 2
799028 上午 12:15:00 南行 正确的 4
799028 上午 12:30:00 南行 正确的 6
799028 中午 12:00:00 南行 直通 4
799028 上午 12:15:00 南行 直通 6
799028 上午 12:30:00 南行 直通 8
799028 中午 12:00:00 南行 剩下 6
799028 上午 12:15:00 南行 剩下 8
799028 上午 12:30:00 南行 剩下 10
799028 中午 12:00:00 南行 掉头 10
799028 上午 12:15:00 南行 掉头 12
799028 上午 12:30:00 南行 掉头 14

示例结果:

交集_id 开始时间 方法 移动 体积
799028 中午 12:00:00 南行 正确的 24
799028 上午 12:15:00 南行 正确的 30
799028 上午 12:30:00 南行 正确的 38
799028 中午 12:00:00 南行 直通
799028 上午 12:15:00 南行 直通
799028 上午 12:30:00 南行 直通
799028 中午 12:00:00 南行 剩下
799028 上午 12:15:00 南行 剩下
799028 上午 12:30:00 南行 剩下
799028 中午 12:00:00 南行 掉头
799028 上午 12:15:00 南行 掉头
799028 上午 12:30:00 南行 掉头

这将不断重复,直到遍历所有 ID 和方法。

我尝试了几种不同的方法:

df['app_sum'] = df.groupby(['intersection_id','start_time','approach'], as_index=False)['volume'].transform('sum')

但是,此代码不会正确分组,也不会提供 nan 值;一旦通过初始时间戳集,它将重复这些值。

我尝试的第二个代码是

indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=4, offset=-3)
df['app_sum'] = (
    df.groupby(['intersection_id','start_time','approach'])['volume'].rolling(window=indexer).sum().droplevel(0))

我知道这是错误的,因为没有窗户。

有什么建议么?

标签: pythonpandasgroup-by

解决方案


你可以使用:

df['volume'] = (df.groupby(['intersection_id', 'start_time', 'approach'])
                  ['volume'].transform('sum')
                  .where(df['movement'].eq('Right'))
                )

输出:

    intersection_id    start_time     approach movement  volume
0            799028  12:00:00 AM   Southbound    Right     22.0
1            799028  12:15:00 AM   Southbound    Right     30.0
2            799028  12:30:00 AM   Southbound    Right     38.0
3            799028  12:00:00 AM   Southbound     Thru      NaN
4            799028  12:15:00 AM   Southbound     Thru      NaN
5            799028  12:30:00 AM   Southbound     Thru      NaN
6            799028  12:00:00 AM   Southbound     Left      NaN
7            799028  12:15:00 AM   Southbound     Left      NaN
8            799028  12:30:00 AM   Southbound     Left      NaN
9            799028  12:00:00 AM   Southbound   U-turn      NaN
10           799028  12:15:00 AM   Southbound   U-turn      NaN
11           799028  12:30:00 AM   Southbound   U-turn      NaN

推荐阅读