python - Pandas 数据帧按时间间隔分组,然后按计数总和 ID

我试图先按时间对数据集进行分组,然后使用 pandas 按 ID 分组,同时对计数进行求和。我的数据看起来像这样:

id,selected time,count
1,5/16/2022 3:58:06 PM,1
1,5/16/2022 3:55:10 PM,1
2,5/16/2022 3:52:01 PM,2
3,5/16/2022 3:19:33 PM,1
3,5/16/2022 3:15:04 PM,1
4,5/16/2022 3:12:38 PM,1
1,5/16/2022 2:42:58 PM,1
1,5/16/2022 2:26:13 PM,1
2,5/16/2022 2:21:02 PM,1
5,5/16/2022 2:18:21 PM,1
4,5/16/2022 2:15:18 PM,1

我试图让我的数据看起来像这样:

id,5/16/2022 2:00:00 PM,5/16/2022 3:00:00 PM
1,2,2
2,2,1
3,2,0
4,1,1
5,1,0

当然,这是数据的一个子集,整个数据集在 24 小时内包含更多的 id。

在许多其他方法中,我试过这个:

df = df.groupby('id') \
    .resample('60min', on='selected time')['count']
    .sum() \
    .unstack(1, fill_value=0) \
    .reset_index(level=0)

但是此方法不会返回正确的 values (因为它首先按 id 分组,然后按时间间隔分组),而我尝试过的其他方法要么抛出错误,要么也有同样的问题。

我是 pandas 的新手,所以我还在学习。任何帮助将不胜感激,谢谢!

回答1

首先,创建一个新的列,其中分钟和秒被设置为零,通过放置小时。然后 Pivot_table 给出所需的结果

df['selected_time_2'] = df['selected time'].astype('datetime64').dt.floor('h').dt.strftime('%m/%d/%YY %I:%M:%S %p')

df.pivot_table(index='id',columns='selected_time_2', values='count', aggfunc='sum').fillna('').reset_index()
selected_time_2     id  05/16/2022Y 02:00:00 PM     05/16/2022Y 03:00:00 PM
0   1   2   2
1   2   1   2
2   3       2
3   4   1   1
4   5   1

编辑:以 12 小时格式显示列

import datetime

df['selected_time_2'] = df['selected time'].astype('datetime64').dt.floor('h')  #.dt.strftime('%m/%d/%Y %I:%M:%S %p').astype('datetime64')

df2 = df.pivot_table(index='id',columns='selected_time_2', values='count', aggfunc='sum').fillna('').reset_index() 

df2.columns = [col.strftime('%m/%d/%Y %I:%M:%S %p') 
               if (isinstance(col, datetime.date)  )
               else col
               for col in df2.columns]
df2

结果:

id  05/16/2022 11:00:00 AM  05/16/2022 12:00:00 PM  05/16/2022 02:00:00 PM  05/16/2022 03:00:00 PM
0   1   1.0     1.0     2.0     
1   2           1.0     2.0
2   3               2.0
3   4           1.0     1.0
4   5           1.0

添加 aggfunc 以获得总和,在响应中第一次错过了 PS:我不确定如何正确格式化结果,并且可以就此提出建议。

相似文章