如何使用Python计算区间分组数据集的近似中位数?
针对分组数据集近似中位数的计算,两种实现方案都可行:
方案1:调用现成库直接计算,无需自行写核心逻辑
你可以用statsmodels的加权统计模块直接实现,pandas也可配合做数据预处理,示例代码如下:
import pandas as pd from statsmodels.stats.weightstats import DescrStatsW # 构造你的样本数据集 df = pd.DataFrame({ "年龄区间": ["1-10", "10-20", "20-30", "30-40", "40-50", "50-60"], "频数": [123, 350, 200, 1700, 360, 60] }) # 拆分区间得到组上下限、组中值 df[['组下限', '组上限']] = df['年龄区间'].str.split('-', expand=True).astype(int) df['组中值'] = (df['组下限'] + df['组上限']) / 2 # 以频数为权重计算加权中位数(近似结果) weighted_stats = DescrStatsW(df['组中值'], weights=df['频数']) approx_median = weighted_stats.quantile(0.5, return_pandas=False) print(f"近似中位数:{approx_median:.2f}")
方案2:自行实现标准统计公式,灵活度更高、结果更符合统计规范
分组数据的近似中位数有通用的插值计算公式,自行实现代码量极小,也不需要复杂的遍历逻辑:
公式:中位数 = L + [(n/2 - F) / f] * w
参数说明:
- L:中位数所在组的下限
- n:总频数
- F:中位数所在组之前的累计频数
- f:中位数所在组的频数
- w:组距
对应实现代码:
# 计算总频数、累计频数 total_cnt = df['频数'].sum() df['累计频数'] = df['频数'].cumsum() # 定位中位数所在组 median_group_idx = df[df['累计频数'] >= total_cnt/2].index[0] L = df.loc[median_group_idx, '组下限'] F = df.loc[median_group_idx-1, '累计频数'] if median_group_idx > 0 else 0 f = df.loc[median_group_idx, '频数'] w = df.loc[median_group_idx, '组上限'] - df.loc[median_group_idx, '组下限'] standard_median = L + (total_cnt/2 - F)/f * w print(f"标准插值法近似中位数:{standard_median:.2f}")
总结
- 追求快速调用直接用
statsmodels的加权分位数接口即可,不需要自己实现计算逻辑 - 如果需要严格对齐统计标准、或者有自定义计算需求,自己实现插值公式的代码量非常小,比调用第三方库的灵活度更高
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

