2013-02-28 2 views
20

У меня есть кадр данных, и я хотел бы знать, сколько раз данный столбец имеет наиболее частое значение.Как получить номер наиболее частого значения в столбце?

Я пытаюсь сделать это следующим образом:

items_counts = df['item'].value_counts() 
max_item = items_counts.max() 

В результате я получаю:

ValueError: cannot convert float NaN to integer 

Насколько я понимаю, с первой строки я получаю серию, в которой значения из столбца используются в качестве ключа, а частота этих значений используется как значения. Итак, мне просто нужно найти наибольшее значение в серии, и по какой-то причине это не сработает. Кто-нибудь знает, как эта проблема может быть решена?

+0

Есть ли 'na' в вашей колонке? Если это так, вы должны избавиться от них с помощью «dropna» или «fillna». – beardc

ответ

22

Похоже, что у вас могут быть некоторые нули в столбце. Вы можете оставить их с помощью df = df.dropna(subset=['item']). Затем df['item'].value_counts().max() должен предоставить вам максимальные значения, а df['item'].value_counts().idxmax() должен предоставить вам наиболее частое значение.

+0

И ... могу ли я сделать так, чтобы NA считался значением? То есть Я счастлив вернуть NA, если это наиболее распространенная ценность. –

+0

@FullDecent использовать '.fillna()' вместо '.dropna()' – beardc

8

Вы также можете использовать функцию scipy mode, которая игнорирует NaN. Решение использовать его может выглядеть следующим образом:

from scipy.stats import mode 
from numpy import nan 
df = DataFrame({"a": [1,2,2,4,2], "b": [nan, nan, nan, 3, 3]}) 
print mode(df) 

Выходной сигнал будет выглядеть

(array([[ 2., 3.]]), array([[ 3., 2.]])) 

означает, что наиболее распространенные значения 2 для первых столбцов и 3 для второй, с частотами 3 и 2 соответственно.

7

Чтобы продолжить ответ @jonathanrocher, вы можете использовать mode в pandas DataFrame. Он будет давать самые частые значения (один или два) по строкам или столбцам:

import pandas as pd 
import numpy as np 
df = pd.DataFrame({"a": [1,2,2,4,2], "b": [np.nan, np.nan, np.nan, 3, 3]}) 

In [2]: df.mode() 
Out[2]: 
    a b 
0 2 3.0