Mein Problem ist, wie man Häufigkeiten für mehrere Variablen in Pandas berechnet. Ich habe von diesem Datenrahmen:Frequenztabellen in Pandas (wie plyr in R)
d1 = pd.DataFrame({'StudentID': ["x1", "x10", "x2","x3", "x4", "x5", "x6", "x7", "x8", "x9"],
'StudentGender' : ['F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'M'],
'ExamenYear': ['2007','2007','2007','2008','2008','2008','2008','2009','2009','2009'],
'Exam': ['algebra', 'stats', 'bio', 'algebra', 'algebra', 'stats', 'stats', 'algebra', 'bio', 'bio'],
'Participated': ['no','yes','yes','yes','no','yes','yes','yes','yes','yes'],
'Passed': ['no','yes','yes','yes','no','yes','yes','yes','no','yes']},
columns = ['StudentID', 'StudentGender', 'ExamenYear', 'Exam', 'Participated', 'Passed'])
zu folgendem Ergebnis
Participated OfWhichpassed
ExamenYear
2007 3 2
2008 4 3
2009 3 2
(1) Eine Möglichkeit, habe ich versucht, zwei Datenrahmen zu berechnen, und bindet es
t1 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Participated'], aggfunc = len)
t2 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Passed'], aggfunc = len)
tx = pd.concat([t1, t2] , axis = 1)
Res1 = tx['yes']
(2) Die zweite Möglichkeit besteht darin, eine Aggregationsfunktion zu verwenden.
import collections
dg = d1.groupby('ExamenYear')
Res2 = dg.agg({'Participated': len,'Passed': lambda x : collections.Counter(x == 'yes')[True]})
Res2.columns = ['Participated', 'OfWhichpassed']
Beide Wege sind awckward, gelinde gesagt. Wie wird das in Pandas richtig gemacht?
PS: Ich habe auch versucht value_counts statt collections.Counter konnte aber nicht
Als Referenz an die Arbeit: Vor einigen Monaten habe ich ähnliche Frage für R here und plyr konnte gefragt Hilfe
---- ------ UPDATE
Benutzer DSM ist richtig. Es gab einen Fehler im gewünschten Tabellenergebnis.
(1) Der Code für die Option ist
t1 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], aggfunc = len)
t2 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Participated'], aggfunc = len)
t3 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Passed'], aggfunc = len)
Res1 = pd.DataFrame({'All': t1,
'OfWhichParticipated': t2['yes'],
'OfWhichPassed': t3['yes']})
Es wird das Ergebnis produzieren
All OfWhichParticipated OfWhichPassed
ExamenYear
2007 3 2 2
2008 4 3 3
2009 3 3 2
(2) Für Option 2 dank Benutzer herrfz, ich herausgefunden, wie um value_count zu verwenden und der code wird
Res2 = d1.groupby('ExamenYear').agg({'StudentID': len,
'Participated': lambda x: x.value_counts()['yes'],
'Passed': lambda x: x.value_counts()['yes']})
Res2.columns = ['All', 'OfWgichParticipated', 'OfWhichPassed']
sein, die th produzieren wird e gleiche Ergebnis wie Res1
Meine Frage aber bleibt: (für einen anderen Betrieb)
Option Mit 2 wird es möglich sein, zweimal die gleiche Variable zu verwenden, kann man einen benutzerdefinierten Namen für die resultierende Variable übergeben?
---- Ein neues Update ----
Ich habe schließlich beschlossen, gelten zu verwenden, die ich verstehe, flexibler ist. Diese
Ich bin mir nicht sicher, ob ich Ihre Ausgabe verstehe. Betrachtet man 2007, scheint es zwei Studenten zu geben, die teilgenommen haben = ja, aber Ihre gewünschte Ausgabe hat "3" - d. H. Alle 2007 Studenten. Möchten Sie, dass die Werte der neuen Participated-Spalte die Anzahl sind? – DSM
.. Eigentlich sind deine 'Res1' und' Res2' nicht einverstanden, also bin ich mir nicht sicher, ob du dich auch dafür entschieden hast. – DSM
Sie haben recht: Was ich mit 'Teilgenommen' meinte, ist eigentlich die Länge des DataFrames (und nicht Teilgenommen == ja). Macht nichts, ich denke, die zweite Lösung sieht vielversprechender aus – user1043144