熊猫:按其他列分组的列中位数

时间:2020-08-01 13:48:39

标签: python pandas pandas-groupby

我有这样的数据框

 plan_id route_id   dtn
   801      12289     2629.0
   801      12289     1666.0
   801      12289     7700.0
   801      12289     2216.0
   801      7734      2219.0
   801      7734      853.0
   653      8819      3375.0
   653      8819      2184.0

dtn以秒为单位。而dtn是路线中到下一次交货的距离,即在索引3处,这就是交货索引3与交货索引4之间的距离。**

我需要找到每个给定plan_id的每个route_id的平均距离,并将其作为列添加到与相应pid和route_id匹配的现有数据帧中。

最初,我对dtn求和,以得出每个路线(route_id)和plan_id使用的总距离

df=df.groupby(['plan_id','route_id'])['dtn'].sum().reset_index()

然后我决定再次使用plan_id和route_id进行分组,以使用

df.groupby(['plan_id','route_id')['dtn'].median()

但是,它返回相同的求和数据帧,没有任何更改。值得注意的是,plain_id可以具有多个路由(route_id),反之亦然。

1 个答案:

答案 0 :(得分:0)

如果要查找给定计划ID和rout_id的中位数,为什么要使用sum? 使用您显示的df:

df=pd.DataFrame({
"plan_id":[801,801,801,801,801,801,653,653],
"route_id": [12289,12289,12289,12289,7734,7734,8819,8819],
"dtn":[2629,1666,7700,2216,2219,853,3375,2184]})

我将dtn列更改为小数字,因此更容易理解中位数:

df["dtn"]=range(1,9)
df
    plan_id route_id    dtn
  0  801    12289       1
  1  801    12289       2
  2  801    12289       3
  3  801    12289       4
  4  801    7734        5
  5  801    7734        6
  6  653    8819        7
  7  653    8819        8

从此示例中,您可以看到给定route_id 12289的pid 801的中位数是该组数字的中位数:[1,2,3,4]。意思是2.5

pid 801和路由ID 7734的中位数是[5,6]的中位数,所以它是5.5,依此类推。

结果可以通过以下方式获得:

    grouped=df.groupby(['plan_id','route_id'])['dtn'].median().reset_index()
    grouped
    plan_id route_id    dtn
    0   653 8819        7.5
    1   801 7734        5.5
    2   801 12289       2.5

现在您可以将df与分组的df一起加入,以获取每个pid和路线ID的中位数作为列

df.merge(grouped, left_on=['plan_id','route_id'],right_on= 
['plan_id','route_id'],suffixes=("","_median"))
    plan_id route_id    dtn dtn_median
  0  801    12289          1    2.5
  1  801    12289          2    2.5
  2  801    12289          3    2.5
  3  801    12289          4    2.5
  4  801    7734           5    5.5
  5  801    7734           6    5.5
  6  653    8819           7    7.5
  7  653    8819           8    7.5