2014-01-24 56 views
4

我有一個有兩列的DataFrame。其中一個是包含時間戳和另一個一個行動的id。類似的東西:來自Pandas DataFrame的出現次數描述

2000-12-29 00:10:00  action1 
2000-12-29 00:20:00  action2 
2000-12-29 00:30:00  action2 
2000-12-29 00:40:00  action1 
2000-12-29 00:50:00  action1 
... 
2000-12-31 00:10:00  action1 
2000-12-31 00:20:00  action2 
2000-12-31 00:30:00  action2 

我想知道在某一天有多少種特定類型的動作被執行。 也就是說對於每一天,我需要對actionX的出現次數進行計數,並將這些數據與X軸上的日期以及Y軸上的actionX出現次數進行比較。

當然,我可以通過迭代我的數據集來天真地計算每一天的行爲。但是,對於熊貓/ matplotlib來說,「正確的方法」是什麼?

回答

4

   mydate col_name 
0 2000-12-29 00:10:00 action1 
1 2000-12-29 00:20:00 action2 
2 2000-12-29 00:30:00 action2 
3 2000-12-29 00:40:00 action1 
4 2000-12-29 00:50:00 action1 
5 2000-12-31 00:10:00 action1 
6 2000-12-31 00:20:00 action2 
7 2000-12-31 00:30:00 action2 

開始,你可以做

df['mydate'] = pd.to_datetime(df['mydate']) 
df = df.set_index('mydate') 
df['day'] = df.index.date 
counts = df.groupby(['day', 'col_name']).agg(len) 

但也許還有一個更簡單的方法。無論如何,上述應該工作。

如果你想使用次數的數據幀,我會再轉換回

counts = pd.DataFrame(counts, columns=['count']) 
+0

感謝您的回答!我改變了代碼中的最後一行:'counts = df.groupby([df.day.to_period('D'),'col_name'])。agg(len)',因爲我需要按天分組數據而不是來自指數的確切時間。它工作並給了我多重索引的Series對象。不過,我仍然無法繪製這些數據,因爲我不能「摧毀」它們。我在這裏問了關於這個問題的單獨問題http://stackoverflow.com/questions/21352520/pandas-unstack-doesnt-work 似乎有一個錯誤。 但是由於'unstack'不起作用,也許有另一種方式來繪製這些數據?謝謝 – Timofey

13

您可以通過使用

df.groupby([df.index.date, 'action']).count() 

得到計數,也可以使用此方法直接繪製

df.groupby([df.index.date, 'action']).count().plot(kind='bar') 

您也可以將結果存儲到count然後將其繪製爲間隔得非常好。假設你的索引已經是datetimeindex格式,否則按照上面的@mkln的指示。

+2

按順序得到結果是非常有用的,所以我會添加'order()'到管道 – kiril

相關問題