如何使用熊猫按组计算时差?
发布于 2021-01-29 18:40:57
问题
我想diff
按组计算。而且我不知道如何对time
列进行排序,以便对每个组的结果进行排序和确定。
原始数据:
In [37]: df
Out[37]:
id time
0 A 2016-11-25 16:32:17
1 A 2016-11-25 16:36:04
2 A 2016-11-25 16:35:29
3 B 2016-11-25 16:35:24
4 B 2016-11-25 16:35:46
我想要的结果
Out[40]:
id time
0 A 00:35
1 A 03:12
2 B 00:22
注意:时间col的类型是timedelta64 [ns]
试
In [38]: df['time'].diff(1)
Out[38]:
0 NaT
1 00:03:47
2 -1 days +23:59:25
3 -1 days +23:59:55
4 00:00:22
Name: time, dtype: timedelta64[ns]
没有得到想要的结果。
希望
因为有5000万行,所以不仅可以解决问题,而且代码可以快速运行。
关注者
0
被浏览
52
1 个回答
-
您可以使用
sort_values
与groupby
和汇总diff
:df['diff'] = df.sort_values(['id','time']).groupby('id')['time'].diff() print (df) id time diff 0 A 2016-11-25 16:32:17 NaT 1 A 2016-11-25 16:36:04 00:00:35 2 A 2016-11-25 16:35:29 00:03:12 3 B 2016-11-25 16:35:24 NaT 4 B 2016-11-25 16:35:46 00:00:22
如果需要删除列
NaT
中diff
使用的行dropna
:df = df.dropna(subset=['diff']) print (df) id time diff 2 A 2016-11-25 16:35:29 00:03:12 1 A 2016-11-25 16:36:04 00:00:35 4 B 2016-11-25 16:35:46 00:00:22
您还可以覆盖列:
df.time = df.sort_values(['id','time']).groupby('id')['time'].diff() print (df) id time 0 A NaT 1 A 00:00:35 2 A 00:03:12 3 B NaT 4 B 00:00:22
df.time = df.sort_values(['id','time']).groupby('id')['time'].diff() df = df.dropna(subset=['time']) print (df) id time 1 A 00:00:35 2 A 00:03:12 4 B 00:00:22