2016-06-16 2 views
1

Ich habe einen Pandas-Datenrahmen, wo eine Spalte eine Liste aller Kurse ist, die ein Student belegt. Der Index ist die ID des Studenten.Wie finden Sie die gängigsten Sets mit Python?

Ich würde gerne die am häufigsten verwendeten Kurse für alle Studenten finden. Wenn zum Beispiel sieht der Datenrahmen wie folgt aus:

ID |  Courses 
1   [A, C] 
2   [A, C] 
3   [A, C] 
4   [B, C] 
5   [B, C] 
6   [K, D] 
... 

Dann würde ich die Ausgabe wie die häufigsten Sätze und ihre Frequenz zurückkehren, so etwas wie:

{[A,C]: 3, [B,C]: 2} 
+0

[pandas.Series.value_counts()] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.value_counts.html)? – sascha

+0

Diese Funktion gibt den Fehler zurück: _TypeError: nicht hashbarer Typ: 'list'_ –

+1

Naja ... weil Listen irgendwie nicht hashbar sind (bei veränderbar) :-) Konvertiere sie in Tupel, was immer besser ist. – sascha

Antwort

2
import pandas as pd 

# create example data 
a = range(6) 
b = [['A', 'C'], ['A', 'C'], ['A', 'C'], ['B', 'C'], ['B', 'C'], ['K', 'D']] 
df = pd.DataFrame({'ID': a, 'Courses': b}) 

# convert lists in Courses-column to tuples (which some parts of pandas need) 
df['Courses'] = df['Courses'].apply(lambda x: tuple(x)) 
print(df.Courses.value_counts()) 

Ausgang:

(A, C) 3 
(B, C) 2 
(K, D) 1 
Name: Courses, dtype: int64 

Edit (wie meine Antwort akzeptiert wurde):

jezrael beschreibt (zunächst als Kommentar auf meine Antwort) a viel kompaktere Version des gleichen Ansatzes:

a = range(6) 
b = [['A', 'C'], ['A', 'C'], ['A', 'C'], ['B', 'C'], ['B', 'C'], ['K', 'D']] 
df = pd.DataFrame({'ID': a, 'Courses': b}) 

print(df.Courses.value_counts()) # list->tuple and counting in one line! 
+2

Sie können 'lambda':' (df.Courses.apply (tuple) .value_counts()) ' – jezrael

+0

einfach wow. Das ist schön. Wenn Sie dies als kurze Antwort hinzufügen würden, würde ich upvote. :-) – sascha

+0

Danke euch beiden! –

5

Sie zuerst list konvertieren tuples und dann value_counts. Verwendung Last to_dict:

print (df.Courses.apply(tuple).value_counts()[:2].to_dict()) 
{('A', 'C'): 3, ('B', 'C'): 2} 
+0

Dies ist der eleganteste Code, den ich heute gesehen habe (was eine große Verbesserung für meinen ursprünglichen Ansatz darstellt)! – sascha

+0

Danke. Schöner Tag! – jezrael

Verwandte Themen