Pandas df:不同列中的组,箱和平均值?

问题描述 投票:0回答:2

我的数据从本质上看起来像这个虚拟表:

speed_observation, car_brand, traction_force
10, ford, 2
20, ford, 4
35, seat, 8
50, ford, 16
10, audi, 2
20, audi, 5
43, audi, 2
12, seat, 2.5
10, ford, 0.5
30, audi, 6
23, ford, 4
17, seat, 5.5
10, seat, 10
38, audi, 2
40, ford, 9
19, ford, 6.6
49, seat, 18
18, ford, 4 

[我想按汽车品牌对数据框进行分组,并针对每个品牌将速度观测值划分为多个范围(例如[0,25]和[25,50]),然后针对每个品牌和分类来计算测得的平均牵引力,收到类似的内容:

speed_bin_upper_lim, car_brand, avrg_traction_force_in_speed_bin
25, audi, X1
50, audi, X2
25, ford, X3
50, ford, X4
25, seat, X5
50, seat, X6

我该如何做?它应适用于任意数量的唯一car_brand类,并且用户应仅提供速度档的数量或速度档的范围(例如n=3[0,25,50])。我想pd.groupbypd.cut可以做到,但是我没有找到确切的方法。谢谢

python pandas dataframe pandas-groupby binning
2个回答
0
投票

您可以将speed_observation切成所需的垃圾箱,然后按其分组:

cuts = pd.cut(df['speed_observation'], [0,25,50])

(df.groupby(['car_brand', cuts])
   .traction_force.mean()
   .reset_index(name='avg_traction_force')
)

输出:

  car_brand speed_observation  avg_traction_force
0      audi           (0, 25]            3.500000
1      audi          (25, 50]            3.333333
2      ford           (0, 25]            3.516667
3      ford          (25, 50]           12.500000
4      seat           (0, 25]            6.000000
5      seat          (25, 50]           13.000000

0
投票

我们也可以使用:

blocks = (df.speed_observation.sub(1)//25).add(1).mul(25)
df.groupby(['car_brand',blocks]).traction_force.mean().reset_index()
© www.soinside.com 2019 - 2024. All rights reserved.