Pandas:按其他列分组的列的中间值

2024-04-16 15:52:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的数据帧

 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求和,以找到每条路线的总行驶距离(路线id)和计划id,使用

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

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

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

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


1条回答
网友
1楼 · 发布于 2024-04-16 15:52:24

如果要查找给定计划id和路线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

从本例中,您可以看到给定路线_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

相关问题 更多 >