首页 > 解决方案 > 添加一列,其中包含来自另一个数据框的 ID 列表

问题描述

问题
我想groupby对数据框执行 a ,生成的数据框包含一个列,其元素是groupby参数列表。

示例
我有一个ship_cluster带有ShipID,latitude的数据框longitude和一个名为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在列表中查看。显然,我可以先做一个groupby:

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

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

标签: pythonpython-3.xpandaspandas-groupby

解决方案


我相信需要,如果需要聚合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]

推荐阅读