pandas如何计算每个NAME分组2009-2015年WFR均值并赋值给分组所有行
实现思路
先筛选出2009-2015年的有效记录,按NAME分组计算WFR列的平均值,再将分组均值广播到对应NAME的所有行即可。
完整实现代码
import pandas as pd # 构造示例DataFrame data = {'NAME': ['A', 'B', 'B', 'B', 'B', 'C', 'C', 'D', 'D', 'D'], 'YEAR': [2017, 2009, 2011, 2017, 2018, 2010, 2018, 2014, 2015, 2016], 'WFR': [20, 50, 80, 60, 90, 10, 30, 40, 55, 45]} df = pd.DataFrame(data) # 方法1:分步骤实现,可读性更高 # 1. 筛选2009-2015年的记录,按NAME分组计算WFR均值 year_filter = df['YEAR'].between(2009, 2015) group_avg = df[year_filter].groupby('NAME')['WFR'].mean() # 2. 将均值映射到原DataFrame所有对应NAME的行 df['WFR_AVG_2009_2015'] = df['NAME'].map(group_avg) # 方法2:单行简洁实现 # df['WFR_AVG_2009_2015'] = df['WFR'].where(df['YEAR'].between(2009,2015)).groupby(df['NAME']).transform('mean')
结果说明
各分组的计算结果如下:
- NAME为A:无2009-2015年的记录,平均值为
NaN,可按需用fillna()填充默认值 - NAME为B:2009、2011年WFR分别为50、80,平均值为65
- NAME为C:2010年WFR为10,平均值为10
- NAME为D:2014、2015年WFR分别为40、55,平均值为47.5
所有同NAME的行,WFR_AVG_2009_2015列的值均为上述对应分组的平均值,符合需求。
内容的提问来源于stack exchange,提问作者Marzieh Karimi
相关产品推荐
相关产品推荐

