使用Pandas的groupby计算admin_2分组的平均面积占比
Pandas计算admin_2分组平均面积占比的正确实现
原始DataFrame
country admin_1 admin_2 year season_name production area A1 B1 C1 1991 Primary 43170 25980 A1 B1 C1 1990 Primary 45624 29820 A1 B1 C1 1989 Primary 56310 31284 A1 B1 C1 1988 Primary 33523 24832 A1 B1 C1 1987 Primary 49388 33479 A1 B1 C1 1986 Primary 36475 27425 A1 B1 C1 1985 Primary 32278 32046 A1 B1 C1 1984 Primary 52073 28929 A1 B1 C1 1983 Primary 51746 32855 A1 B1 C2 1991 Primary 32010 20010 A1 B1 C2 1990 Primary 52704 19520 A1 B1 C2 1989 Primary 65240 18640 A1 B1 C2 1988 Primary 11570 17800 A1 B1 C2 1987 Primary 51282 20350 A1 B1 C2 1986 Primary 25808 19816 A1 B1 C2 1985 Primary 16935 18817 A1 B2 C3 1987 Primary 51282 20350 A1 B2 C3 1986 Primary 25808 19816 A1 B2 C3 1985 Primary 16935 18817
需求说明
- 第一步:计算每个
admin_2分组(按country维度划分)在所有年份的平均面积 - 第二步:计算各
admin_2平均面积占所属country下所有admin_2平均面积总和的比例
当前代码问题
你尝试的代码:
df['area_percentage'] = df.groupby(['country', 'admin_2'])['area'].apply(lambda x: x / x.sum())
实现的是每个admin_2分组内单一年份面积占该分组总面积的比例,和需求完全不符。
正确实现步骤与代码
步骤分解
- 计算每个
country-admin_2组合的平均面积 - 基于
country分组,计算每个admin_2平均面积的占比 - 将计算好的占比合并回原DataFrame
代码实现
# 步骤1:计算每个country-admin_2的平均面积 admin2_avg_area = df.groupby(['country', 'admin_2'])['area'].mean().reset_index(name='avg_area') # 步骤2:计算每个admin_2平均面积在所属country内的占比 admin2_avg_area['area_percentage'] = admin2_avg_area.groupby('country')['avg_area'].apply( lambda x: x / x.sum() ) # 步骤3:将占比合并回原DataFrame df = df.merge(admin2_avg_area[['country', 'admin_2', 'area_percentage']], on=['country', 'admin_2'], how='left')
结果说明
执行后,原DataFrame会新增area_percentage列,每个admin_2分组下的所有行将对应相同的占比值,该值为该admin_2的平均面积占所属country内所有admin_2平均面积总和的比例。
内容的提问来源于stack exchange,提问作者user308827
相关产品推荐
相关产品推荐

