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?

766voto

EdChum Punkte 333941

Sie können dies mit groupby durchführen, um nach der gewünschten Spalte zu gruppieren und dann list auf jede Gruppe anzuwenden:

In [1]: df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6]})
        df

Out[1]: 
   a  b
0  A  1
1  A  2
2  B  5
3  B  5
4  B  4
5  C  6

In [2]: df.groupby('a')['b'].apply(list)
Out[2]: 
a
A       [1, 2]
B    [5, 5, 4]
C          [6]
Name: b, dtype: object

In [3]: df1 = df.groupby('a')['b'].apply(list).reset_index(name='new')
        df1
Out[3]: 
   a        new
0  A     [1, 2]
1  B  [5, 5, 4]
2  C        [6]

121voto

Anamika Modi Punkte 928

Ein praktischer Weg, dies zu erreichen, wäre:

df.groupby('a').agg({'b':lambda x: list(x)})

Schauen Sie sich die Erstellung benutzerdefinierter Aggregationen an: https://www.kaggle.com/akshaysehgal/how-to-group-by-aggregate-using-py

74voto

B. M. Punkte 17300

Wenn Leistung wichtig ist, gehen Sie auf die numpy-Ebene:

import numpy as np

df = pd.DataFrame({'a': np.random.randint(0, 60, 600), 'b': [1, 2, 5, 5, 4, 6]*100})

def f(df):
         keys, values = df.sort_values('a').values.T
         ukeys, index = np.unique(keys, True)
         arrays = np.split(values, index[1:])
         df2 = pd.DataFrame({'a':ukeys, 'b':[list(a) for a in arrays]})
         return df2

Tests:

In [301]: %timeit f(df)
1000 loops, best of 3: 1.64 ms per loop

In [302]: %timeit df.groupby('a')['b'].apply(list)
100 loops, best of 3: 5.26 ms per loop

61voto

Markus Dutschke Punkte 6917

Um dies für mehrere Spalten eines Datenrahmens zu lösen:

In [5]: df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6],'c'
   ...: :[3,3,3,4,4,4]})

In [6]: df
Out[6]: 
   a  b  c
0  A  1  3
1  A  2  3
2  B  5  3
3  B  5  4
4  B  4  4
5  C  6  4

In [7]: df.groupby('a').agg(lambda x: list(x))
Out[7]: 
           b          c
a                      
A     [1, 2]     [3, 3]
B  [5, 5, 4]  [3, 4, 4]
C        [6]        [4]

Diese Antwort wurde inspiriert von Anamika Modi's Antwort. Danke!

40voto

cs95 Punkte 325143

Verwenden Sie eines der folgenden groupby und agg Rezepte.

# Setup
df = pd.DataFrame({
  'a': ['A', 'A', 'B', 'B', 'B', 'C'],
  'b': [1, 2, 5, 5, 4, 6],
  'c': ['x', 'y', 'z', 'x', 'y', 'z']
})
df

   a  b  c
0  A  1  x
1  A  2  y
2  B  5  z
3  B  5  x
4  B  4  y
5  C  6  z

Um mehrere Spalten als Listen zu aggregieren, verwenden Sie eines der folgenden:

df.groupby('a').agg(list)
df.groupby('a').agg(pd.Series.tolist)

           b          c
a                      
A     [1, 2]     [x, y]
B  [5, 5, 4]  [z, x, y]
C        [6]        [z]

Um nur eine einzelne Spalte zu Gruppen-Listen zu machen, konvertieren Sie das groupby-Objekt in ein SeriesGroupBy-Objekt und rufen Sie dann SeriesGroupBy.agg auf. Verwenden Sie,

df.groupby('a').agg({'b': list})  # 4.42 ms 
df.groupby('a')['b'].agg(list)    # 2.76 ms - schneller

a
A       [1, 2]
B    [5, 5, 4]
C          [6]
Name: b, dtype: object

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