如何使用熊猫按组计算时差?

发布于 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 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用sort_valuesgroupby和汇总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
    

    如果需要删除列NaTdiff使用的行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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看