python - 如何使用 Pandas 按组计算时差?

标签 python sorting pandas difference timedelta

问题

我想按组计算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万行,所以代码可以跑得很快。

最佳答案

您可以使用 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

如果需要删除 diff 列中带有 NaT 的行,请使用 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

关于python - 如何使用 Pandas 按组计算时差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40804265/

相关文章:

python - 使用参数、关键字参数、*args、**kwargs 与 Python 函数混淆

matlab - 如何重新排列该矩阵的列?

python - 根据括号位置对 pandas 数据帧值使用 str.split

python - 具有连接列的 Pandas 数据框

python - 过滤数据框中的日期索引

python - 为什么我的缓冲 GraphicsContext 应用程序存在闪烁问题?

Python 切片显示相同的 id 位置

python - 如何在 seaborn 中显示所有数字图例值?

java - 如何使此代码打印数组中的最高值?

Javascript 排序自定义比较器函数 - 对已排序的数组进行排序