2016-09-21 8 views
2

ich einen Pandas Datenrahmen in folgendem Format haben:Pandas groupby über Liste

Arrival Departure Park Station Count 
     8  10 5 [1,2]  1 
     5  12 6 [3,4]  1 
     8  10 5 [1,2]  1 

Ich möchte von der Ankunft dieses Datenrahmen GROUPBY, Abfahrt, Park und Bahnhof, aber da Station eine Liste ist, erhalte ich ein Fehler. Die Ausgabe sollte wie folgt aussehen:

Arrival Departure Park Station Count 
     8  10 5 [1,2]  2 
     5  12 6 [3,4]  1 

Könnten Sie bitte lassen Sie mich wissen, ob es eine Möglichkeit gibt, dieses Problem zu lösen?

+0

Was ist Ihre gewünschte Ausgabe? –

+0

Ich möchte einen Datenrahmen durch Gruppieren der Zeilen basierend auf Ankunft, Abfahrt, Park und Bahnhof erhalten. – user36729

Antwort

4

Das Problem ist, dass ein Python list is a mutable type, and hence unhashable. An der Stelle, an der Sie das groupby Kriterium df.Station eingegeben haben, setzen Sie stattdessen df.Station.apply(tuple). Dies wandelt die Listen in Tupel um, die hashbar (und unveränderbar) sind.

Zum Beispiel:

In [66]: df = pd.DataFrame({'Arrival': [8, 5, 4], 'Station': [[1, 2], [3, 4], [1, 2]]}) 

In [67]: df.groupby([df.Arrival, df.Station.apply(tuple)]).Arrival.sum() 
Out[67]: 
Arrival Station 
4  (1, 2)  4 
5  (3, 4)  5 
8  (1, 2)  8 
Name: Arrival, dtype: int64 

Umgekehrt

df.groupby([df.Arrival, df.Station]).Arrival.sum() 

wird nicht funktionieren.

+0

Es funktioniert, aber es gibt mir Serie. Wie kann ich einen Datenrahmen erstellen? – user36729

+0

@ user36729 Wenn Sie eine Serie 's' haben und sie zu einem DataFrame machen möchten, können Sie' s.to_frame() 'verwenden. –

+0

Danke. Auf diese Weise bleiben "Ankunft" und "Station" im Index des Datenrahmens zusammen. Gibt es sie überhaupt, um sie zu teilen? – user36729

1
import pandas as pd 
df = pd.DataFrame({'arrival':[8,5,8], 'departure':[10,12,10], \ 
'park':[5,6,5], 'station':[[1,2], [3,4], [1,2]]}) 

df['arrival_station'] = df.station.apply(lambda x: x[0]) 
df['departure_station'] = df.station.apply(lambda x: x[1]) 
print df 

    arrival departure park station arrival_station departure_station 
0  8   10  5 [1, 2]    1     2 
1  5   12  6 [3, 4]    3     4 
2  8   10  5 [1, 2]    1     2 

Jetzt sind Ihre Stationsdaten frei und Sie können wie gewohnt gruppieren.