如何用Python Pandas按GroupID分组新增min_avg等三列?
用Pandas按分组新增统计列的实现方案
没问题,这在Pandas里用groupby结合transform方法就能完美实现,正好满足你需要给每行填充对应组内统计值的需求。下面是具体的代码步骤和解释:
步骤1:构造原始数据
先把你提供的示例数据转换成Pandas DataFrame:
import pandas as pd data = { 'avg': [25.5, 26.7, 25.8, 53.5, 29.3, 27.7], 'groupId': [1016, 1048, 1016, 1048, 1064, 1016] } df = pd.DataFrame(data)
步骤2:计算分组统计列
我们用groupby('groupId')对数据按组分组,然后用transform方法把组内的统计结果映射回每一行(这一步是关键,能保证每个组的所有行都填充对应的组内统计值):
# 新增min_avg:同一groupId下avg的最小值 df['min_avg'] = df.groupby('groupId')['avg'].transform('min') # 新增max_avg:同一groupId下avg的最大值 df['max_avg'] = df.groupby('groupId')['avg'].transform('max') # 新增group_average:每行min_avg和max_avg的平均值 df['group_average'] = (df['min_avg'] + df['max_avg']) / 2
查看最终结果
运行完上面的代码后,打印df就能得到符合需求的结果:
avg groupId min_avg max_avg group_average 0 25.5 1016 25.5 27.7 26.6 1 26.7 1048 26.7 53.5 40.1 2 25.8 1016 25.5 27.7 26.6 3 53.5 1048 26.7 53.5 40.1 4 29.3 1064 29.3 29.3 29.3 5 27.7 1016 25.5 27.7 26.6
小补充说明
注意:你给出的期望结果中groupId=1048的min_avg写的是26.3,但根据你提供的原始数据,该组的avg值是26.7和53.5,所以实际计算出来的min_avg是26.7,对应的group_average是40.1。如果是原始数据输入有误,调整数据后重新运行代码即可得到正确结果。
内容的提问来源于stack exchange,提问作者JokerMartini
相关产品推荐
相关产品推荐

