2017-08-23 3 views
1

Ich habe eine pandas.DataFrame mit der folgenden Struktur:GROUPBY und reduzieren pandas Datenrahmen mit numpy Arrays als Einträge

>>> data 
a b values 
1 0 [1, 2, 3, 4] 
2 0 [3, 4, 5, 6] 
1 1 [1, 3, 7, 9] 
2 1 [2, 4, 6, 8] 

('values' hat die Art der numpy.array). Was ich tun möchte ist, die Daten nach Spalte 'a' zu gruppieren und dann die Liste der Werte zu kombinieren. Mein Ziel ist es mit der folgenden, am Ende:

>>> data 
a values 
1 [1, 2, 3, 4, 1, 3, 7, 9] 
2 [3, 4, 5, 6, 2, 4, 6, 8] 

Beachten Sie, dass die Reihenfolge der Werte nicht Angelegenheit. Wie erreiche ich das? Ich dachte über so etwas wie

>>> grps = data.groupby(['a']) 
>>> grps['values'].agg(np.concatenate) 

aber nicht mit einem KeyError. Ich bin mir sicher, dass es einen Panda- Weg gibt, um das zu erreichen - aber wie? Danke.

Antwort

2

Ähnlich wie die Antwort des John Galt, können Sie Gruppe und dann np.hstack gelten:

In [278]: df.groupby('a')['values'].apply(np.hstack) 
Out[278]: 
a 
1 [1, 2, 3, 4, 1, 3, 7, 9] 
2 [3, 4, 5, 6, 2, 4, 6, 8] 
Name: values, dtype: object 

Rahmen Um wieder, werden Sie pd.Series.to_frame benötigen und pd.reset_index:

In [311]: df.groupby('a')['values'].apply(np.hstack).to_frame().reset_index() 
Out[311]: 
    a     values 
0 1 [1, 2, 3, 4, 1, 3, 7, 9] 
1 2 [3, 4, 5, 6, 2, 4, 6, 8] 

Leistung

df_test = pd.concat([df] * 10000) # setup 

%timeit df_test.groupby('a')['values'].apply(np.hstack) # mine 
1 loop, best of 3: 219 ms per loop 

%timeit df_test.groupby('a')['values'].sum() # John's 
1 loop, best of 3: 4.44 s per loop 

sum ist sehr ineffizient für die Liste, und funktioniert nicht, wenn Values ein np.array ist.

+0

Wie erreiche ich, dass die resultierende Spalte noch den Namen "Werte" hat? – rammelmueller

+0

@rammelmuller Was willst du über a machen, und b? Lass es fallen? –

+0

'' b'' wird standardmäßig gelöscht, ''a'' sollte bleiben und gleich aufgerufen werden. – rammelmueller

1

Sie können sum verwenden, um Listen beizutreten.

In [640]: data.groupby('a')['values'].sum() 
Out[640]: 
a 
1 [1, 2, 3, 4, 1, 3, 7, 9] 
2 [3, 4, 5, 6, 2, 4, 6, 8] 
Name: values, dtype: object 

Oder

In [653]: data.groupby('a', as_index=False).agg({'values': 'sum'}) 
Out[653]: 
    a     values 
0 1 [1, 2, 3, 4, 1, 3, 7, 9] 
1 2 [3, 4, 5, 6, 2, 4, 6, 8] 
+0

Es scheint, dass mit numpy Arrays die Summe Version nicht funktioniert, schlägt es mit der Meldung: ‚Funktion verringert nicht‘ - ich numpy Array Detail bearbeitet auch ein wenig lat, sorry. – rammelmueller

Verwandte Themen