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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:24:06