Python pandas按日重新采样,按值分组

时间:2016-03-01 17:19:54

标签: python pandas

我尝试创建每个用户每天每个故障单总时间的堆积条形图,我的DataFrame看起来像这样:

date_timestamp      ticket  time  user
23/03/2015 12:00:00 D-146   120   blgo
04/04/2015 12:00:00 D-173   15    blgo
29/04/2015 12:00:00 P-110   60    frle
29/04/2015 15:47:29 P-113   180   chki
29/04/2015 15:47:55 P-113   30    chki
30/04/2015 12:00:00 P-108   240   frle
30/04/2015 12:00:00 P-116   120   hahe
30/04/2015 13:46:25 P-116   240   hahe
01/05/2015 09:20:48 P-113   120   frle
01/05/2015 09:39:13 P-107   45    frle

图表上的每个条形图表示一天中的一个用户 - 条形图的高度表示当天以分钟为单位的总时间,并且将按用户登录每张票证的时间量按比例分配那天。

我知道我可以使用以下内容获得每位用户每天的总时间:

df[(df.user == 'blgo')]['time'].resample('B',how='sum').fillna(0)

我也知道我可以按照这样的方式对数据帧进行分组:

df2=df['time'].groupby(df['ticket'])

据推测,为了实现我的目标,我需要为每个用户提供一个数据帧,索引上有天数,列数为列,每个单元格将是当天登录该票证的总时间。

任何帮助或建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可能需要进行一些额外的调整,具体取决于您希望如何处理日期而没有特定用户的贡献,但您想要的基本结构是pivot table。从您的数据框开始:

df.reset_index()
df['date'] = df['date_timestamp'].dt.date
del df['date_timestamp']
df2 = pd.pivot_table(df, index=['date', 'user'], columns=['ticket'], values='time', aggfunc=np.sum)
df2.fillna(value=0, inplace=True)
df2.plot(kind='bar', stacked=True)

enter image description here