573 Stimmen

Wie man DataFrame-Zeilen in einer Liste in Pandas GroupBy gruppieren

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?

31voto

Mithril Punkte 11476

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.

28voto

Acorbe Punkte 8263

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

18voto

Sean.H Punkte 642

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}

9voto

Vanshika Punkte 153

Wenn Sie nach einer einzigartigen Liste suchen, während Sie mehrere Spalten gruppieren, könnte dies wahrscheinlich helfen:

df.groupby('a').agg(lambda x: list(set(x))).reset_index()

9voto

Metrd Punkte 99

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.com

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.

Powered by:

X