2016-09-21 134 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。