2014-01-13 171 views
5

選擇列的最頻繁的數據我有以下的列數據框:查找和大熊貓數據幀

file['DirViento'] 

Fecha 
2011-01-01 ENE 
2011-01-02 ENE 
2011-01-03 ENE 
2011-01-04 NNE 
2011-01-05 ENE 
2011-01-06 ENE 
2011-01-07 ENE 
2011-01-08 ENE 
2011-01-09 NNE 
2011-01-10 ENE 
2011-01-11 ENE 
2011-01-12 ENE 
2011-01-13 ESE 
2011-01-14 ENE 
2011-01-15 ENE 
... 
2011-12-17 ENE 
2011-12-18 ENE 
2011-12-19 ENE 
2011-12-20 ENE 
2011-12-21 ENE 
2011-12-22 ENE 
2011-12-23 ENE 
2011-12-24 ENE 
2011-12-25 ENE 
2011-12-26 ESE 
2011-12-27 ENE 
2011-12-28  NE 
2011-12-29 ENE 
2011-12-30 NNE 
2011-12-31 ENE 
Name: DirViento, Length: 290, dtype: object 

列有全年各月風向每日記錄。我試圖獲得每個月的主導方向。要做到這一點,選擇數據最常見的一個月內重複:

file['DirViento'].groupby(lambda x: x.month).value_counts() 


1 ENE 23 
    NNE  6 
    E  1 
    ESE  1 
2 ENE 21 
    NNO  3 
    NNE  2 
    NE  1 
3 ENE 21 
    OSO  1 
    ESE  1 
    SSE  1 
4 ENE 21 
    NNE  2 
    ESE  1 
    NNO  1 
6 ENE 15 
    ESE  2 
    SSE  2 
    ONO  1 
    E  1 
7 ENE 22 
    ONO  1 
    OSO  1 
    NE  1 
    NNE  1 
    NNO  1 
8 ENE 23 
    NNE  5 
    NE  1 
    ONO  1 
    ESE  1 
9 ENE 17 
    NNE  7 
    ONO  2 
    NE  1 
    E  1 
    ESE  1 
    NNO  1 
10 ENE 16 
    NNE  2 
    ESE  2 
    NNO  2 
    ONO  1 
    NE  1 
    E  1 
11 ENE 13 
    NNE  2 
    ESE  2 
    ONO  1 
12 ENE 26 
    NNE  3 
    NE  1 
    ESE  1 
Length: 54, dtype: int64 

運行下面的代碼行。當

wind_moda=file['DirViento'].groupby(lambda x: x.month).agg(lambda x: stats.mode(x)[0][0]) 

應該得到這樣的事情

 1 ENE  
    2 ENE  
    3 ENE 
    4 ENE 
    6 ENE 
    7 ENE  
    8 ENE  
    9 ENE 
    10 ENE 
    11 ENE 
    12 ENE 

,但我得到如下:

1   E 
2  ENE 
3  ENE 
4  ENE 
6   E 
7  ENE 
8  ENE 
9   E 
10   E 
11  ENE 
12  ENE 

爲什麼在12個月中有4個沒有考慮到最常見的數據?

難道我做錯了什麼?

任何想法獲得每月最常見的數據?

+0

你要什麼發生,如果超過一個方向具有相同的(最大)在某一個月算什麼? – DSM

回答

3

這並不像它可能(應該)那麼直截了當。

正如您可能知道的那樣,最常見值的統計術語是「模式」。 Numpy沒有內置函數,但scipy確實沒有。導入像這樣:

from scipy.stats.mstats import mode 

它不只是簡單地返回最常見的值,as you can read about in the docs,所以它的方便,定義使用mode只得到了最常見的值的函數。

f = lambda x: mode(x, axis=None)[0] 

而現在,而不是value_counts(),使用apply(f)。這裏有一個例子:

In [20]: DataFrame([1,1,2,2,2,3], index=[1,1,1,2,2,2]).groupby(level=0).apply(f) 
Out[20]: 
1 1.0 
2 2.0 
dtype: object 

更新: SciPy的的mode不處理字符串。對於你的字符串數據,你需要定義一個更一般的模式函數。 This answer應該做的伎倆。

6

熊貓0.15.2有一個DataFrame.mode()方法。對於像我這樣尋找這個東西的人來說,這可能是有用的。

這裏是the docs

編輯:對於Value:

DataFrame.mode()[0]