我想使用pandas和python添加三列。我不确定如何根据具有相同GroupID值的行添加其他列。
我不完全确定从哪里开始。
我有这个:
avg groupId
0 25.5 1016
1 26.7 1048
2 25.8 1016
3 53.5 1048
4 29.3 1064
5 27.7 1016
我的目标是:
avg groupId min_avg max_avg group_average
0 25.5 1016 25.5 27.7 26.6
1 26.7 1048 26.3 53.5 39.9
2 25.8 1016 25.5 27.7 26.6
3 53.5 1048 26.3 53.5 39.9
4 29.3 1064 29.3 29.3 29.3
5 27.7 1016 25.5 27.7 26.6
答案 0 :(得分:4)
我们可以用merge
groupby
来describe
df=df.merge(df.groupby('groupId').avg.describe()[['mean','min','max']].reset_index(),how='left')
Out[25]:
avg groupId mean min max
0 25.5 1016 26.333333 25.5 27.7
1 26.7 1048 40.100000 26.7 53.5
2 25.8 1016 26.333333 25.5 27.7
3 53.5 1048 40.100000 26.7 53.5
4 29.3 1064 29.300000 29.3 29.3
5 27.7 1016 26.333333 25.5 27.7
答案 1 :(得分:2)
YOBEN_S解决方案中给出的describe
方法将计算出比所需数量更多的统计信息,包括count
,std
和dtypes
。参见here。
我们可以使用agg
方法来解决这个问题。
df.merge(df.groupby('groupId')['avg'].agg([min, max, 'mean']), on='groupId')
# output
avg groupId min max mean
0 25.5 1016 25.5 27.7 26.333333
1 26.7 1048 26.7 53.5 40.100000
2 25.8 1016 25.5 27.7 26.333333
3 53.5 1048 26.7 53.5 40.100000
4 29.3 1064 29.3 29.3 29.300000
5 27.7 1016 25.5 27.7 26.333333
方法1
%%timeit -n 1000
df.merge(df.groupby('groupId').avg.describe()[['mean','min','max']].reset_index(),how='left')
每个循环9.6 ms±123 µs(平均±标准偏差,共运行7次,每个循环1000次)
方法2
%%timeit -n 1000
df.merge(df.groupby('groupId')['avg'].agg([min, max, 'mean']), on='groupId')
每个循环3.42 ms±74.4 µs(平均±标准偏差,共运行7次,每个循环1000次)
方法3
此外,我们可以通过将df.merge
转换为df.join
来略微加快速度。
每个循环2.96 ms±29.3 µs(平均±标准偏差,共运行7次,每个循环1000次)