You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

年龄金字塔绘制及年龄组均值中位数计算的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 20:43:31