2016-04-08 9 views
2

Ich habe eine Reihe von Umfrageantworten, die ich mit Pandas analysieren möchte. Mein Ziel ist es (in diesem Beispiel) das gängigste Geschlecht in jedem Bezirk in den USA zu finden, so dass ich den folgenden Code:Gruppe von mit Modus als Aggregator

import pandas as pd 
from scipy import stats 
file['sex'].groupby(file['county']).agg([('modeSex', stats.mode)]) 

Die Ausgabe lautet:

enter image description here

Wie kann Ich entpacke das, um nur den Moduswert und nicht den zweiten Wert zu erhalten, der angibt, wie oft der Modus auftritt? Hier

ist ein Beispiel des Datenrahmens:

county|sex 
---------- 
079 | 1 
---------- 
079 | 2 
---------- 
079 | 2 
---------- 
075 | 1 
---------- 
075 | 1 
---------- 
075 | 1 
---------- 
075 | 2 

Wunsch Ausgabe lautet:

county|modeSex 
---------- 
079 | 2 
---------- 
075 | 1 

Antwort

1

Pandas über die Rückkehr Array beschwert (ich Pandas Zelle erraten eine numpy Array nicht halten kann), wenn Sie stats.mode verwenden (x) [0] so können Sie konvertieren es auf eine Liste oder ein Tupel:

df = pd.DataFrame({"C1": np.random.randint(10, size=100), "C2": np.random.choice(["X", "Y", "Z"], size=100)}) 
print(df.groupby(['C2']).agg(lambda x: tuple(stats.mode(x)[0]))) 

Out:

 C1 
C2  
X (0,) 
Y (4,) 
Z (3,) 

Da es mehrere Modi geben kann, benötigen Sie Tupel oder Listen, wenn Sie alle beibehalten möchten. Wenn Sie den ersten Modus möchten, können Sie, dass extrahieren:

df.groupby(['C2']).agg(lambda x: stats.mode(x)[0][0]) 

Out: 

    C1 
C2  
X 0 
Y 4 
Z 3 
+0

'Datei ['Geschlecht']. Groupby (Datei ['Grafschaft']). Agg ({'ModusSex': Lambda x: stats.mode (x) [ 0] [0]}) 'endete als Gewinner ... Danke! – Josh

1

scipy.stats.mode kehrt array of modal values, array of counts for each mode so wir stats.mode(a)[0] können nur erste Wert zurückgeben

Hier ist der Code

import pandas as pd 
from scipy import stats 
# sample data frame 
df2 = pd.DataFrame({'X' : ['B', 'B', 'A', 'A'], 'Y' : [1, 2, 3, 4]}) 
# use lambda functions 
print df2.groupby(['X']).agg({'Y': lambda x:stats.mode(x)[0]}) 

Ausgabe:

y 
X 
A 3 
B 1 
+0

Sinn konzeptionell macht, aber habe diesen Fehler: Ausnahme: Muss aggregierten Wert erzeugen – Josh

+0

können Sie den Code zusammen mit einer Probe Datenrahmen – sid

+0

gut wie pro Ihre Probe abgeben Datensatzcode läuft auf meiner Seite gut – sid