我有这个df:
Date Plate Route Speed VehiceType
0 2020-11-03 13:54:00 0660182 Route 66 32 Wagon
1 2020-11-03 13:25:03 939CH003 Route 35 24 Truck
2 2020-11-03 09:27:11 WH3457 Route 02 41 Bus诸若此类。我需要相同的车牌车辆之间的时间差,我很容易就能得到这样的结果:
df.groupby('Plate').Date.diff( )然后,我排序(否则我会有不同的日期/盘子,这是我不需要的)和分组如下:
df2 = df.sort_values(by=['Plate', 'Date']).groupby('Plate').Date.diff().dt.total_seconds().reset_index()我最后得到一个df (重命名一列后),如下所示:
index Difference (s)
0 34517 NaN
1 377539 33.0
2 119714 34.0
3 300900 765.0这不是我需要的(“索引”栏应该是板块的)。我想要的是:
Plate Difference
0 WH3457 54.0
1 9W432T 24.0
2 947CH05 33.0这样,这个df就可以通过版本号(left_on和right_on)对某些滤波器进行合并。熊猫说,合并不能完成,因为“索引”列只是数字,而板块列显然是一个字符串(我在排序时某种程度上忽略了板块对象)。那么,如何才能得到这个板块/差分df呢?(按盘和日期进行排序是必须的,否则差异是没有意义的)。我一直在为这件事而挣扎,却无法理解。提前谢谢你。
编辑:
这是原始df的更大一部分(抱歉,西班牙语中的定位和车辆类型):
Date Plate Route Latitude Longitud Speed VehicleType
0 2020-11-17 13:54:00+00:00 0660182 RUTA 66 19.333958 -99.199240 10 AUTOBUS LARGO (MAYOR A 10 M DE LONGITUD)
1 2020-11-17 13:54:00+00:00 939CH001M RUTA 51 19.256760 -98.955510 22 AUTOBUS LARGO (MAYOR A 10 M DE LONGITUD)
2 2020-11-17 13:54:00+00:00 596NZ008M RUTA 102 19.448385 -98.952400 0 VAGONETA
3 2020-11-17 13:54:00+00:00 0790024 RUTA 79 19.429462 -99.150820 0 MICROBUS (MENOR A 7.5 M DE LONGITUD)
4 2020-11-17 13:54:01+00:00 947CH045M RUTA 50 19.282007 -99.009000 28 MICROBUS (MENOR A 7.5 M DE LONGITUD)
... ... ... ... ... ... ... ...
1279721 2020-11-18 05:59:57+00:00 0120414 RUTA 12 19.357872 -99.077920 0 MICROBUS (MENOR A 7.5 M DE LONGITUD)
1279722 2020-11-18 05:59:58+00:00 1090016 CETRAM XOCHIMILCO 200826 19.295107 -99.102936 0 MICROBUS (MENOR A 7.5 M DE LONGITUD)
1279723 2020-11-18 05:59:59+00:00 0350144 RUTA 35 19.297995 -99.061150 0 VAGONETA
1279724 2020-11-18 05:59:59+00:00 006908 RUTA 106 19.490650 -99.174640 0 AUTOBUS CORTO (ENTRE 7.5 Y 10 M DE LONGITUD)
1279725 2020-11-18 05:59:59+00:00 0340071 RUTA 34 19.324417 -99.165500 1 MICROBUS (MENOR A 7.5 M DE LONGITUD)发布于 2020-11-25 02:13:50
如果您希望将计算结果(以秒为单位)返回原始数据,则可以使用熊猫groupby.transform:
df['diff_in_sec'] = df.groupby('Plate').Date.transform(lambda x: x.diff().dt.total_seconds())此外,由于apply函数不执行任何聚合,df2具有与df相同的原始行形状,因此可以使用index将值映射回df,如下所示:
df2 = df.sort_values(by=['Plate', 'Date']).groupby('Plate').Date.diff().dt.total_seconds()
# this
df.loc[df2.index, 'diff_in_sec'] = df2
# or this
df2.name = 'diff_in_sec'
df.merge(df2, left_index=True, right_index=True)https://stackoverflow.com/questions/64992091
复制相似问题