2014-01-13 2 views
5

У меня есть dataframe со следующей колонке:найти и выбрать наиболее часто данные столбца в панд DataFrame

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 

Почему в 4 из 12 месяцев не учитываются наиболее частые данные?

Я что-то не так?

Любая идея получать самые распространенные данные каждый месяц?

+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 

Update: SciPy-х mode не работает со строками. Для ваших строковых данных вам необходимо определить более общую функцию режима. This answer должен сделать трюк.

6

Pandas 0.15.2 имеет метод DataFrame.mode(). Это может быть полезно для тех, кто ищет это, как и я.

Адрес the docs.

Edit: Для Value:

DataFrame.mode()[0] 
Смежные вопросы