年龄金字塔绘制及年龄组均值中位数计算的Python优化实现
自动化实现人口年龄金字塔与年龄统计计算
原始数据
用户提供的人口年龄分布数据如下:
0-9 10-19 20-29 30-39 40-49 50-59 60-69 70-79 80-89 90-99 100-109 110-119 Male -692 -772 -741 -698 -707 -511 -371 -203 -95 -17 -8 -1.0 Female 676 771 808 865 815 581 400 226 102 15 8 0.0
优化方案:自动化流程
1. 自动化解析数据并构建DataFrame
不再手动录入数据,直接从原始文本解析处理,同时合并100-109和110-119为100+年龄组:
import pandas as pd import matplotlib.pyplot as plt # 原始数据文本 data_text = """ 0-9 10-19 20-29 30-39 40-49 50-59 60-69 70-79 80-89 90-99 100-109 110-119 Male -692 -772 -741 -698 -707 -511 -371 -203 -95 -17 -8 -1.0 Female 676 771 808 865 815 581 400 226 102 15 8 0.0 """ # 清洗并拆分数据行 lines = [line.strip() for line in data_text.split('\n') if line.strip()] age_groups = lines[0].split() male_data = list(map(float, lines[1].split()[1:])) female_data = list(map(float, lines[2].split()[1:])) # 合并高龄组并反转顺序(适配金字塔从上到下的展示逻辑) merged_age_groups = age_groups[:-2] + ['100+'] merged_male = male_data[:-2] + [sum(male_data[-2:])] merged_female = female_data[:-2] + [sum(female_data[-2:])] merged_age_groups = merged_age_groups[::-1] merged_male = merged_male[::-1] merged_female = merged_female[::-1] # 构建DataFrame,男性数据取负数用于金字塔左侧展示 age_df = pd.DataFrame({ 'Age': merged_age_groups, 'Male': [-x for x in merged_male], 'Female': merged_female })
2. 绘制年龄金字塔
用Matplotlib实现自动化绘制,代码简洁通用:
plt.figure(figsize=(10, 8)) # 绘制男女分组成条形 plt.barh(age_df['Age'], age_df['Male'], color='#1f77b4', label='Male') plt.barh(age_df['Age'], age_df['Female'], color='#ff7f0e', label='Female') # 调整图表样式 plt.xlabel('Population') plt.ylabel('Age Group') plt.title('Population Age Pyramid') plt.legend() plt.grid(axis='x', linestyle='--', alpha=0.7) # 将x轴负数刻度转为正数显示 plt.xticks(ticks=plt.xticks()[0], labels=[abs(x) for x in plt.xticks()[0]]) plt.tight_layout() plt.show()
3. 计算年龄组均值与中位数
通过年龄组中值加权计算均值,累计人口插值计算中位数:
# 定义年龄组代表值的计算函数 def get_group_age(age_str): if age_str == '100+': return 105 low, high = map(int, age_str.split('-')) return (low + high) / 2 # 添加年龄组代表值与总人口列 age_df['Group_Age'] = age_df['Age'].apply(get_group_age) age_df['Total'] = age_df['Male'].abs() + age_df['Female'] # 计算加权均值 weighted_mean = (age_df['Group_Age'] * age_df['Total']).sum() / age_df['Total'].sum() # 计算中位数 cumulative_total = age_df['Total'].cumsum() median_total = age_df['Total'].sum() / 2 median_row = age_df[cumulative_total >= median_total].iloc[0] # 插值计算精确中位数 prev_cum = cumulative_total.loc[median_row.name - 1] if median_row.name > 0 else 0 median = median_row['Group_Age'] - 5 + (median_total - prev_cum) / median_row['Total'] * 10 print(f"年龄组加权均值: {weighted_mean:.2f}") print(f"年龄组中位数: {median:.2f}")
方案优势
- 完全自动化解析原始数据,避免手动录入的人为错误
- 逻辑模块化,修改年龄分组规则或数据格式时只需调整对应模块
- 统计计算逻辑通用化,可快速适配其他人口数据场景
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

