我有一个这样的数据帧
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.0dtn以秒为单位。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),反之亦然。
发布于 2020-08-02 04:21:13
如果您正在寻找给定计划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。
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.5https://stackoverflow.com/questions/63205912
复制相似问题