我试图先按时间对数据集进行分组,然后使用 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:我不确定如何正确格式化结果,并且可以就此提出建议。