2014-01-13 242 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]