当前位置: 首页 > 面试题库 >

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

祁建业
2023-03-14
问题内容

问题

我想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

如果需要删除列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


 类似资料:
  • 假设我有这样一个数据帧: 我想从最大库存计数开始找到给定项目库存的平均变化率,然后用它来计算哪一天库存会达到零。所以对于苹果来说,它将从2/1开始:,同样对于香蕉来说,从2/2开始。 由于有不同的项目,我用了: 要仅获取苹果的数据帧,请使用: 查找具有最大库存计数的行。 然而,这给了我原始数据帧行的行标签。所以我不确定接下来该怎么办,因为我的计划是先用最大库存量将日期从行中删除,然后忽略之前的任何

  • 问题内容: 因此,我的时间戳如下所示: 我将它们放在DataFrame中,并且尝试按升序对其进行排序。我尝试了以下方法。但是,它似乎不起作用 任何帮助表示赞赏。 问题答案: 您只需要确保正确表示格式规范,就可以将其转换为之前的 实际 日期时间。 这比分解组件中的时间戳并按照您的尝试执行多准则排序要直接得多。 演示版

  • 如何通过键访问Groupby对象中相应的Groupby数据框? 使用以下groupby: 我可以迭代它来获取密钥和组: 我想能够访问一个组的关键: 但是当我试着用这样做时,我得到了一个奇怪的对象,它似乎没有任何与我想要的数据帧对应的方法。 我能想到的最好的办法是: 但是考虑到熊猫在这些事情上通常有多好,这有点令人讨厌。 这样做的内置方法是什么?

  • 我有一个数据框,其中包含各种建筑的消费数据。这些建筑被划分为几个类别,并进一步划分为子类别。如何返回每个子类别本身的建筑数量计数?

  • 问题内容: 我有下表。我想根据以下公式计算按每个日期分组的加权平均值。我可以使用一些标准的常规代码来执行此操作,但是假设此数据在pandas数据框中,是否有比通过迭代更简单的方法来实现此目的? 2012年1月1日w_avg = 0.5 (60 / sum(60,80,100))+ .75 (80 / sum(60,80,100))+ 1.0 *(100 / sum(60,80,100)) 2012

  • 我有一个熊猫数据框(df),有四列,我想要一个新的列来表示这四列的平均值:df['mean']=df。平均数(1) 到目前为止还不错。但当我将结果保存到csv文件时,我发现: 我想我可以在“平均值”列中强制使用格式,但知道为什么会发生这种情况吗? 我使用winpython与python 3.3.2和熊猫0.11.0