2013-02-28 12 views
20

Ho un frame di dati e vorrei sapere quante volte una determinata colonna ha il valore più frequente.Come ottenere il numero del valore più frequente in una colonna?

cerco di farlo nel modo seguente:

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

Come risultato ottengo:

ValueError: cannot convert float NaN to integer 

Per quanto ho capito, con la prima linea ottengo serie in cui il i valori di una colonna vengono utilizzati come chiave e la frequenza di questi valori viene utilizzata come valori. Quindi, ho solo bisogno di trovare il valore più grande della serie e, a causa di qualche ragione, non funziona. Qualcuno sa come risolvere questo problema?

+0

Ci sono 'na' nella colonna? Se è così, dovresti sbarazzartene con 'dropna' o' fillna'. – beardc

risposta

22

Sembra che potresti avere alcuni valori nulli nella colonna. Puoi lasciarli con df = df.dropna(subset=['item']). Quindi df['item'].value_counts().max() dovrebbe fornire i conteggi massimi e df['item'].value_counts().idxmax() dovrebbe fornire il valore più frequente.

+0

E ... posso farlo in modo che NA venga conteggiato come valore? Cioè Sono felice di restituire NA se questo è il valore più comune. –

+0

@FullDecent usa '.fillna()' invece di '.dropna()' – beardc

8

Si può anche considerare l'utilizzo della funzione mode di scipy che ignora NaN. Una soluzione utilizzando potrebbe apparire come:

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) 

L'output sarà simile

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

significa che i valori più comuni sono 2 per le prime colonne e 3 per la seconda, con frequenze 3 e 2 rispettivamente.

7

Per continuare con la risposta @jonathanrocher è possibile utilizzare mode in DataFrame panda. Fornirà i valori più frequenti (uno o due) attraverso le righe o le colonne:

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 
Problemi correlati