2016-03-01 59 views
0

我试图创建的每票每人每天用户总时间的堆积条形图,我DataFrame看起来是这样的:Python的大熊猫重新取样按天,按价值

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']) 

据推测,为了实现我的目标,我需要为每个用户提供一个数据框,其中索引为天,门票为列,每个单元格为当天在该故障单上记录的总时间。

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

+0

你想要的时间花在_fraction_在给定的票在某一天每个用户代表,或_TIME_? (例如,在你的例子中,用户'frle'不知何故设法在2015年4月30日花了54小时在P-108上,而用户'hahe'在那天花了6个小时在P-116上;如果这两者都表示为“100 %用户的时间“或缩小到绝对小时数?) –

+0

我希望*时间* - 在某些情况下,可能导致每天总计超过24小时,但这没关系。不过,我会修改表格,因为这可能会让某些人感到困惑,谢谢指出。 – Charon

回答

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

+0

就是这样 - 非常感谢你!我之前听说过数据透视表,但从未使用过。我现在明白他们。不幸的是,我原来的数据集有5000行和许多用户,所以尝试上面的代码会使我的机器崩溃,但这当然是我必须面对的问题。但是,当我将其限制为只有一个用户时,它可以很好地工作。顺便说一下,大概第5和第6行应该以'df2'开始? – Charon

+0

谢谢,我解决了错别字。如果您的原始数据集对于您的机器来说太大,则可能会有所帮助。 –