如何对组的连续行进行分组和计算?
How to groupby and make calculations on consecutive rows of the group?
例如,让我们考虑以下数据框:
Restaurant_ID Floor Cust_Arrival_Datetime
0 100 1 2021-11-17 17:20:00
1 100 1 2021-11-17 17:22:00
2 100 1 2021-11-17 17:25:00
3 100 1 2021-11-17 17:30:00
4 100 1 2021-11-17 17:50:00
5 100 1 2021-11-17 17:51:00
6 100 2 2021-11-17 17:25:00
7 100 2 2021-11-17 18:00:00
8 100 2 2021-11-17 18:50:00
9 100 2 2021-11-17 18:56:00
对于上面的玩具示例,我们可以认为 Cust_Arrival_Datetime
已按商店和楼层进行排序和分组(如上所示)。现在,我们如何计算每个独特商店和楼层组的客户到达所经过的中值时间间隔等内容?
所需的输出将是:
Restaurant_ID Floor Median Arrival Interval(in minutes)
0 100 1 3
1 100 2 35
中值到达间隔计算如下:对于商店的一楼,我们可以看到当第二位顾客到达时,距离第一位顾客到达已经过去了 2 分钟。类似地,第 2 位和第 3 位顾客之间已经过了 3 分钟,第 3 位和第 4 位顾客之间已经过了 5 分钟,依此类推。1 楼和餐厅 100 的中位数为 3。
我试过这样的事情:
df.groupby(['Restaurant_ID', 'Floor'].apply(lambda row: row['Customer_Arrival_Datetime'].shift() - row['Customer_Arrival_Datetime']).apply(np.median)
但这不起作用!
欢迎任何帮助!
IIUC,你可以的
(df.groupby(['Restaurant_ID', 'Floor'])['Cust_Arrival_Datetime']
.agg(lambda x: x.diff().dt.total_seconds().median()/60))
你得到
Restaurant_ID Floor
100 1 3.0
2 35.0
Name: Cust_Arrival_Datetime, dtype: float64
如果需要,您可以链接 reset_index
考虑以下数据框:
df = pd.DataFrame({
'group': [1,1,1,2,2,2],
'time': pd.to_datetime(
['14:14', '14:17', '14:25', '17:29', '17:40','17:43']
)
})
假设您想应用一系列转换:
def stats(group):
diffs = group.diff().dt.total_seconds()/60
return {
'min': diffs.min(),
'mean': diffs.mean(),
'median': diffs.median(),
'max': diffs.max()
}
那么您只需应用这些:
>>> df.groupby('group')['time'].agg(stats).apply(pd.Series)
min mean median max
group
1 3.0 5.5 5.5 8.0
2 3.0 7.0 7.0 11.0
例如,让我们考虑以下数据框:
Restaurant_ID Floor Cust_Arrival_Datetime
0 100 1 2021-11-17 17:20:00
1 100 1 2021-11-17 17:22:00
2 100 1 2021-11-17 17:25:00
3 100 1 2021-11-17 17:30:00
4 100 1 2021-11-17 17:50:00
5 100 1 2021-11-17 17:51:00
6 100 2 2021-11-17 17:25:00
7 100 2 2021-11-17 18:00:00
8 100 2 2021-11-17 18:50:00
9 100 2 2021-11-17 18:56:00
对于上面的玩具示例,我们可以认为 Cust_Arrival_Datetime
已按商店和楼层进行排序和分组(如上所示)。现在,我们如何计算每个独特商店和楼层组的客户到达所经过的中值时间间隔等内容?
所需的输出将是:
Restaurant_ID Floor Median Arrival Interval(in minutes)
0 100 1 3
1 100 2 35
中值到达间隔计算如下:对于商店的一楼,我们可以看到当第二位顾客到达时,距离第一位顾客到达已经过去了 2 分钟。类似地,第 2 位和第 3 位顾客之间已经过了 3 分钟,第 3 位和第 4 位顾客之间已经过了 5 分钟,依此类推。1 楼和餐厅 100 的中位数为 3。
我试过这样的事情:
df.groupby(['Restaurant_ID', 'Floor'].apply(lambda row: row['Customer_Arrival_Datetime'].shift() - row['Customer_Arrival_Datetime']).apply(np.median)
但这不起作用!
欢迎任何帮助!
IIUC,你可以的
(df.groupby(['Restaurant_ID', 'Floor'])['Cust_Arrival_Datetime']
.agg(lambda x: x.diff().dt.total_seconds().median()/60))
你得到
Restaurant_ID Floor
100 1 3.0
2 35.0
Name: Cust_Arrival_Datetime, dtype: float64
如果需要,您可以链接 reset_index
考虑以下数据框:
df = pd.DataFrame({
'group': [1,1,1,2,2,2],
'time': pd.to_datetime(
['14:14', '14:17', '14:25', '17:29', '17:40','17:43']
)
})
假设您想应用一系列转换:
def stats(group):
diffs = group.diff().dt.total_seconds()/60
return {
'min': diffs.min(),
'mean': diffs.mean(),
'median': diffs.median(),
'max': diffs.max()
}
那么您只需应用这些:
>>> df.groupby('group')['time'].agg(stats).apply(pd.Series)
min mean median max
group
1 3.0 5.5 5.5 8.0
2 3.0 7.0 7.0 11.0