2016-04-01 4 views
1

Ich habe gerade begonnen, mit Python zu arbeiten (pandas) und jetzt habe ich meine erste Frage. Ich habe einen Datenrahmen mit den folgenden Zeilennamen:Datenframe verwenden gruppierte Zeilenwerte als Zeilenname

ID A Class 
1 True [0,5] 
2 False [0,5] 
3 True [5,10] 
4 False [10,20] 
5 True [0,5] 
6 False [10,20] 

nun für eine kühle Lösung, die ich bin auf der Suche, wo ich so etwas tun kann:

Class True False 
[0,5] 2  1 
[5,10] 1  0 
[10,20] 0  2 

ich, wie viel zählen möge True und False ich habe für eine Class Gibt es eine schnelle Lösung? Mein Dataframe könnte mehr als 2 Millionen Einträge haben.

Antwort

1

df Lassen Sie Ihre Datenrahmen werden, würde ich zum ersten Mal verwenden:

g = df.groupby('Class')['A'].value_counts().reset_index() 

, die zurückgibt:

 Class  A 0 
0 [0,5] True 2 
1 [0,5] False 1 
2 [10,20] False 2 
3 [5,10] True 1 

dann würde ich verschwenken Die obige Tabelle, um Ihre gewünschte Form zu erhalten:

a = pd.pivot_table(g, index='Class', columns='A', values=0).fillna(0) 

Das gibt:

A  False True 
Class     
[0,5]  1.0 2.0 
[10,20] 2.0 0.0 
[5,10]  0.0 1.0 
+1

Wenn der Typ von "Klasse" eine Liste und keine Zeichenfolge ist, wird die Ausnahme für den nicht abschaltbaren Typ ausgelöst. –

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Tritt es auch bei der anderen Antwort auf? –

+0

Es tut es. Ungefähr zu kommentieren. –

4

Sie können die Aggregation mit pivot_table durchführen. Danach müssen nur die Spaltennamen und der Index entsprechend der gewünschten Ausgabe formatiert werden.

# Perform the pivot and aggregation. 
df = pd.pivot_table(df, index='Class', columns='A', aggfunc='count', fill_value=0) 

# Format column names and index to match desired output. 
df.columns = [c[1] for c in df.columns] 
df.reset_index(inplace=True) 

Die resultierende Ausgabe:

 Class False True 
0 [0,5]  1  2 
1 [10,20]  2  0 
2 [5,10]  0  1 

Edit:

Die obige Lösung setzt voraus, dass die Elemente der Spalte 'Class' Strings sind. Wenn sie Listen sind, können Sie wie folgt vorgehen:

df['Class'] = df['Class'].map(tuple) 
**original solution code here** 
df['Class'] = df['Class'].map(list) 
+0

Ich konnte es nicht auf Python 2.7 & Pandas 0.18.0 arbeiten. Es funktioniert jedoch mit 'agffunc = len'. – ayhan

+0

Das ist seltsam. Funktioniert für mich auf Python 3.5 & Pandas 0.18.0. – root

+0

Es gibt ein Datenframe mit nur dem Index zurück - keine Anzahl. Ein Problem darüber, wie Wahr/Falsch-Werte gehandhabt werden? – ayhan

Verwandte Themen