import numpy as np
import pandas as pd
df = pd.DataFrame({'Location': ['Canada', 'Canada', 'Canada', 'Canada', 'US', 'US', 'Canada', 'Canada', 'US', 'US'], 'item': ['X', 'X', 'X', 'X', 'X', 'X', 'Y', 'Y', 'Y', 'Y'], 'time': ['10:03:18', '10:08:38', '10:24:46', '11:16:35', '10:00:16', '11:52:12', '2:08:38', '4:01:48', '13:32:02', '14:07:03']})
df['start'] = pd.to_datetime(df['time'])
grouped = df.groupby(['item', 'Location'])
df['end'] = (grouped['start'].transform(lambda grp: grp.min()+pd.Timedelta(hours=1)))
df['mask'] = (df['start'] < df['end'])
result = grouped['mask'].sum()
print(result)
利回り
item Location
X Canada 3.0
US 1.0
Y Canada 1.0
US 2.0
Name: mask, dtype: float64
メインアイデアはitem
とLocation
によってグループにあり、各グループの最小の開始時間を見つけ、その後、1時間を追加します。
df['end'] = (grouped['start'].transform(lambda grp: grp.min()+pd.Timedelta(hours=1)))
transform
df
と同じ長さのシリーズを返すので、各行が値を取得します。
In [319]: df
Out[319]:
Location item time start end
0 Canada X 10:03:18 2016-05-06 10:03:18 2016-05-06 11:03:18
1 Canada X 10:08:38 2016-05-06 10:08:38 2016-05-06 11:03:18
2 Canada X 10:24:46 2016-05-06 10:24:46 2016-05-06 11:03:18
3 Canada X 11:16:35 2016-05-06 11:16:35 2016-05-06 11:03:18
4 US X 10:00:16 2016-05-06 10:00:16 2016-05-06 11:00:16
5 US X 11:52:12 2016-05-06 11:52:12 2016-05-06 11:00:16
6 Canada Y 2:08:38 2016-05-06 02:08:38 2016-05-06 03:08:38
7 Canada Y 4:01:48 2016-05-06 04:01:48 2016-05-06 03:08:38
8 US Y 13:32:02 2016-05-06 13:32:02 2016-05-06 14:32:02
9 US Y 14:07:03 2016-05-06 14:07:03 2016-05-06 14:32:02
今、あなたは簡単に興味の行を識別することができます。 start
がend
未満のものであり、それら:
In [320]: df['mask'] = (df['start'] < df['end'])
In [321]: df
Out[321]:
Location item time start end mask
0 Canada X 10:03:18 2016-05-06 10:03:18 2016-05-06 11:03:18 True
1 Canada X 10:08:38 2016-05-06 10:08:38 2016-05-06 11:03:18 True
2 Canada X 10:24:46 2016-05-06 10:24:46 2016-05-06 11:03:18 True
3 Canada X 11:16:35 2016-05-06 11:16:35 2016-05-06 11:03:18 False
4 US X 10:00:16 2016-05-06 10:00:16 2016-05-06 11:00:16 True
5 US X 11:52:12 2016-05-06 11:52:12 2016-05-06 11:00:16 False
6 Canada Y 2:08:38 2016-05-06 02:08:38 2016-05-06 03:08:38 True
7 Canada Y 4:01:48 2016-05-06 04:01:48 2016-05-06 03:08:38 False
8 US Y 13:32:02 2016-05-06 13:32:02 2016-05-06 14:32:02 True
9 US Y 14:07:03 2016-05-06 14:07:03 2016-05-06 14:32:02 True
item
と
Location
でもう一度グループ化
、望ましい結果が倍mask
の数を合計することによって発見された各グループのために真である:
result = grouped['mask'].sum()
完全な答えをいただきありがとうございます。私は、このアプローチを最初に試したときに私が見逃していたと思います。うまくいく! – Ana