2016-09-21 7 views
2

У меня есть кадр панды данных в следующем формате:Панды GroupBy над списком

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

Я хочу GroupBy этого кадра данных по въезду, выезд, парк и станции, но поскольку станция список, я получаю ошибка. Результат должен выглядеть так:

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

Не могли бы вы сообщить мне, есть ли способ решить эту проблему?

+0

Каков ваш желаемый результат? –

+0

Я хочу получить фрейм данных, группируя строки по прибытию, выезду, парку и станции. – user36729

ответ

4

Проблема в том, что Python list is a mutable type, and hence unhashable. В том месте, где вы положили бы groupby критерий df.Station, вместо этого введите df.Station.apply(tuple). Это преобразует списки в кортежи, которые являются хешируемыми (и неизменяемыми).

Например:

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 

Наоборот,

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

не будет работать.

+0

Он работает, но он дает мне серию. Как я могу сделать это DataFrame? – user36729

+0

@ user36729 Всякий раз, когда у вас есть серия 's', и хотите сделать это в DataFrame, вы можете использовать' s.to_frame() '. –

+0

Спасибо. Таким образом, как «Прибытие», так и «Станция» склеиваются в индексе кадра данных. Есть все равно, чтобы разделить их? – 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 

Теперь данные вашей станции бесплатны, и вы можете группировать их как обычно.