Ich habe einen Pandas-Datenrahmen df
wie:
a b
A 1
A 2
B 5
B 5
B 4
C 6
Ich möchte nach der ersten Spalte gruppieren und die zweite Spalte als Listen in Zeilen erhalten :
A [1,2]
B [5,5,4]
C [6]
Ist es möglich, so etwas mit pandas groupby zu machen?
tuple
hier die zweite Antwort verwendet: stackoverflow.com/questions/19530568/… . Weitere Informationen finden Sie in der zweiten Antwort unter stackoverflow.com/questions/27439023/… .Wenn die Leistung wichtig ist, gehen Sie auf das Numpy-Level:
Tests:
quelle
.groupby([df.index.month, df.index.day])
statt nur.groupby('a')
?Ein praktischer Weg, um dies zu erreichen, wäre:
Schreiben Sie benutzerdefinierte Aggregationen: https://www.kaggle.com/akshaysehgal/how-to-group-by-aggregate-using-py
quelle
lambda args: f(args)
ist gleichbedeutend mitf
agg(list)
genug. Siehe auch hier .df.groupby('a').apply(list)
oder mit agg als Teil eines Diktats verwendendf.groupby('a').agg({'b':list})
. Sie können es auch mit Lambda verwenden (was ich empfehle), da Sie so viel mehr damit machen können. Beispiel:df.groupby('a').agg({'c':'first', 'b': lambda x: x.unique().tolist()})
Hiermit können Sie eine Serienfunktion auf die Spalte c und eine eindeutige und dann eine Listenfunktion auf die Spalte b anwenden.Wie Sie sagten, kann die
groupby
Methode einespd.DataFrame
Objekts die Arbeit erledigen.Beispiel
das gibt und indexweise Beschreibung der Gruppen.
Sie können beispielsweise Elemente einzelner Gruppen abrufen
quelle
So lösen Sie dies für mehrere Spalten eines Datenrahmens:
Diese Antwort wurde von Anamika Modis Antwort inspiriert . Danke dir!
quelle
Verwenden Sie eines der folgenden Rezepte
groupby
undagg
Rezepte.Verwenden Sie eine der folgenden Optionen, um mehrere Spalten als Listen zusammenzufassen:
Um nur eine einzelne Spalte in Gruppen aufzulisten, konvertieren Sie den groupby in ein
SeriesGroupBy
Objekt und rufen Sie dann aufSeriesGroupBy.agg
. Verwenden,quelle
groupby(..., sort=False)
. Hier würde es keinen Unterschied machen, da ich mich in Spalte A gruppiere, die bereits sortiert ist.df.groupby('a')['b'].agg(lambda x: list(set(x)))
Wenn Sie beim Gruppieren mehrerer Spalten nach einer eindeutigen Liste suchen, kann dies wahrscheinlich helfen:
quelle
Verwenden wir
df.groupby
mit Liste undSeries
Konstruktorquelle
Es ist Zeit,
agg
statt zu verwendenapply
.Wann
Wenn Sie möchten, dass mehrere Spalten in einer Liste gestapelt werden, führen Sie zu
pd.DataFrame
Wenn Sie eine einzelne Spalte in der Liste haben möchten, führen Sie zu
ps.Series
Beachten Sie, dass das Ergebnis in
pd.DataFrame
etwa 10-ps.Series
mal langsamer ist als das Ergebnis, wenn Sie nur eine einzelne Spalte aggregieren. Verwenden Sie es in mehrspaltigen Fällen.quelle
Hier habe ich Elemente mit "|" gruppiert. als Trennzeichen
quelle
Der einfachste Weg, den ich bisher gesehen habe, ist, zumindest für eine Spalte, die Anamikas Antwort nur mit der Tupelsyntax für die Aggregatfunktion ähnelt, fast das Gleiche nicht zu erreichen .
quelle