Pandasdf:不同列中的组、bin和average?

2024-05-15 00:27:31 发布

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

我的数据在质量上类似于这个虚拟表:

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]),然后针对每个品牌和bin计算测量的平均牵引力,得到如下结果:

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会这样做,但我没有找到确切的方法


Quang Hoang的答案非常有效,如果您想扩展它,因为您想再按一列进行分组,比如wheel_kind,您的数据帧如下所示:

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

然后只需将wheel_kind列添加到前面的解决方案中,更准确地说:

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

之后别忘了放下南区,因为fordaudi没有冬季车轮:

df_grp.dropna(inplace=True)
df_grp.reset_index(drop=True, inplace=True) #just to reset the index

Tags: 数据dfbincarwheelresetspeedsummer
2条回答

我们可以 创建一个系列以手动分组,作为pd.cut的替代方案

n = 25

blocks = (df.speed_observation.sub(1) // n).add(1).mul(n)
blocks = blocks.rename('speed_bin_upper_lim') 

(df.groupby([blocks, 'car_brand'])
   .traction_force.mean()
   .reset_index(name='avrg_traction_force_in_speed_bin'))

   speed_bin_upper_lim car_brand  avrg_traction_force_in_speed_bin
0                   25      audi                          3.500000
1                   25      ford                          3.516667
2                   25      seat                          6.000000
3                   50      audi                          3.333333
4                   50      ford                         12.500000
5                   50      seat                         13.000000

细节

print(blocks)
0     25
1     25
2     50
3     50
4     25
5     25
6     50
7     25
8     25
9     50
10    25
11    25
12    25
13    50
14    50
15    25
16    50
17    25
Name: speed_bin_upper_lim, dtype: int64

您只需将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

相关问题 更多 >

    热门问题