Gegeben ein DataFrame, möchte ich die erste Spalte gruppieren und die zweite Spalte als Listen in den Zeilen erhalten, so dass ein DataFrame wie:
a b
A 1
A 2
B 5
B 5
B 4
C 6
wird zu
A [1,2]
B [5,5,4]
C [6]
Wie mache ich das?
Gegeben ein DataFrame, möchte ich die erste Spalte gruppieren und die zweite Spalte als Listen in den Zeilen erhalten, so dass ein DataFrame wie:
a b
A 1
A 2
B 5
B 5
B 4
C 6
wird zu
A [1,2]
B [5,5,4]
C [6]
Wie mache ich das?
Es ist an der Zeit, agg
anstelle von apply
zu verwenden.
Wenn
df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6], 'c': [1,2,5,5,4,6]})
Wenn Sie mehrere Spalten zu einer Liste stapeln möchten, Ergebnis in pd.DataFrame
df.groupby('a')[['b', 'c']].agg(list)
# oder
df.groupby('a').agg(list)
Wenn Sie eine einzelne Spalte in einer List möchten, Ergebnis in ps.Series
df.groupby('a')['b'].agg(list)
#oder
df.groupby('a')['b'].apply(list)
Hinweis: Das Ergebnis in pd.DataFrame
ist etwa 10-mal langsamer als das Ergebnis in ps.Series
, wenn Sie nur eine einzelne Spalte aggregieren. Verwenden Sie es in Fällen mit mehreren Spalten.
Wie du sagtest, kann die Methode groupby
eines pd.DataFrame
-Objekts die Arbeit erledigen.
Beispiel
L = ['A','A','B','B','B','C']
N = [1,2,5,5,4,6]
import pandas as pd
df = pd.DataFrame(zip(L,N),columns = list('LN'))
groups = df.groupby(df.L)
groups.groups
{'A': [0, 1], 'B': [2, 3, 4], 'C': [5]}
was eine beschreibende Darstellung der Gruppen in Bezug auf den Index liefert.
Um Elemente einzelner Gruppen zu erhalten, kannst du beispielsweise Folgendes tun
groups.get_group('A')
L N
0 A 1
1 A 2
groups.get_group('B')
L N
2 B 5
3 B 5
4 B 4
Nur ein Supplement. pandas.pivot_table
ist viel universeller und scheint praktischer zu sein
"""Daten"""
df = pd.DataFrame( {'a':['A','A','B','B','B','C'],
'b':[1,2,5,5,4,6],
'c':[1,2,1,1,1,6]})
print(df)
a b c
0 A 1 1
1 A 2 2
2 B 5 1
3 B 5 1
4 B 4 1
5 C 6 6
"""pivot_table"""
pt = pd.pivot_table(df,
values=['b', 'c'],
index='a',
aggfunc={'b': list,
'c': set})
print(pt)
b c
a
A [1, 2] {1, 2}
B [5, 5, 4] {1}
C [6] {6}
Der einfachste Weg, den ich gefunden habe, um das Gleiche zu erreichen, zumindest für eine Spalte, ähnelt Anamikas Antwort, nur mit der Tupelsyntax für die Aggregatfunktion.
df.groupby('a').agg(b=('b','unique'), c=('c','unique'))
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.