添加一个包含另一个数据帧的ID列表的列

时间:2018-05-30 10:15:03

标签: python python-3.x pandas pandas-groupby

问题
我想在数据框上执行groupby,结果数据框包含一个列,其中的元素是groupby参数的列表。

示例
我的数据框ship_cluster包含ShipIDlatitudelongitude和一个名为cluster的列。

In [4]: df = pd.DataFrame({"ShipID": [7, 7, 8, 9],
                           "latitude": [51.872842, 51.872874, 51.872794, 51.872946],
                           "longitude": [5.810379, 5.810729, 5.810754, 5.810548],
                           "cluster": [0, 1, 0, 0]})
print(df)

"ShipID" latitude  longitude cluster
7        51.872842 5.810379  0
7        51.872874 5.810729  1
8        51.872794 5.810754  0
9        51.872946 5.810548  0

我希望得到的所需输出是:

         latitude  longitude ShipID
cluster                            
0        51.872860 5.810560  [7, 8, 9]
1        51.872874 5.810729  [7]

因此,根据cluster,我希望在列表中看到ShipID。显然,我可以先做一个小组:

ship_cluster[["latitude", "longitude", cluster"]].groupby("cluster").mean()

但我不知道下一步,也不知道简化方法。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

我认为如果需要按cluster汇总需要:

d = {"latitude":'mean', "longitude":'mean', "ShipID":lambda x: x.tolist()}
df = ship_cluster.groupby("cluster").agg(d)
print (df)
         latitude  longitude ShipID
cluster                            
0        51.87270    5.81362    [7]
1        51.85040    5.86688    [7]
2        51.87410    5.91493    [7]
3        51.85500    5.96898    [7]
4        51.88101    6.00426    [7]
5        51.87368    6.03096    [7]

ShipID

d = {"latitude":'mean', "longitude":'mean', "cluster":lambda x: x.tolist()}
df = ship_cluster.groupby("ShipID").agg(d)
print (df)
         latitude  longitude             cluster
ShipID                                          
7       51.867815   5.933272  [0, 1, 2, 3, 4, 5]