2016-03-01 89 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

謝謝,我解決了錯別字。如果您的原始數據集對於您的機器來說太大,則可能會有所幫助。 –