2016-09-21 132 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

它的作品,但它給了我係列。我怎樣才能讓它成爲一個數據框? – 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 

現在你的車站數據是免費的,你可以像往常一樣groupby。