我有这样的数据框
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),反之亦然。
答案 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