2013-02-28 8 views
20

Ich habe einen Datenrahmen und ich möchte wissen, wie oft eine gegebene Spalte den häufigsten Wert hat.Wie erhält man die Nummer des häufigsten Wertes in einer Spalte?

Ich versuche es in der folgenden Art und Weise zu tun:

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

Als Ergebnis erhalte ich:

ValueError: cannot convert float NaN to integer 

Soweit ich verstehe, mit der ersten Linie I-Serie erhalten, in dem die Werte aus einer Spalte werden als Schlüssel verwendet, und die Häufigkeit dieser Werte wird als Wert verwendet. Also, ich muss nur den größten Wert in der Serie finden, und aus irgendeinem Grund funktioniert es nicht. Weiß jemand, wie dieses Problem gelöst werden kann?

+0

Gibt es 'na's in Ihrer Spalte? Wenn ja, sollten Sie sie mit 'dropna' oder' fillna' loswerden. – beardc

Antwort

22

Es sieht so aus, als könnten Sie einige Nullen in der Spalte haben. Sie können sie mit df = df.dropna(subset=['item']) löschen. Dann sollte df['item'].value_counts().max() Ihnen die maximale Anzahl geben, und df['item'].value_counts().idxmax() sollte Ihnen den häufigsten Wert geben.

+0

Und ... kann ich es tun, damit NA als Wert gezählt wird? I.e. Ich bin glücklich, NA zurückzugeben, wenn das der häufigste Wert ist. –

+0

@FullDecent verwenden '.fillna()' anstelle von '.dropna()' – beardc

8

Sie können auch scipys mode Funktion verwenden, die NaN ignoriert. Eine Lösung könnte es mit wie folgt aussehen:

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) 

Der Ausgang wie

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

aussehen würde was bedeutet, dass die am häufigsten verwendeten Werte sind 2 für die ersten Spalten und 3 für die zweite, mit Frequenzen 3 und 2 beziehungsweise.

7

Um @jonathanrocher Antwort fortzusetzen, könnten Sie mode in Pandas DataFrame verwenden. Es gibt die häufigsten Werte (ein oder zwei) über die Zeilen oder Spalten:

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