web-dev-qa-db-ja.com

パンダを使用してグループごとの時差を計算するにはどうすればよいですか?

問題

グループ別に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

注意:時間列のタイプは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]

望ましい結果を得ないでください。

望む

5,000万行あるため、問題を解決するだけでなく、コードを高速で実行できます。

18
Jack

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
32
jezrael