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

如何不使用pandas.Series获取列表的统计量(均值、分位数等)

不用Pandas实现类似describe的统计量计算

可以用Python内置函数、标准库搭配简单自定义逻辑实现这些统计量,完全不需要依赖Pandas:

可用工具

  • 内置函数:len()、min()、max()
  • 标准库statistics:提供均值、标准差、中位数的现成计算方法
  • 自定义排序+插值逻辑:处理25%、75%分位数(若不想依赖NumPy这类第三方库)

具体实现步骤

假设你有一个数值型列表data(需保证非空且元素均为数值):

  1. count(数量):直接用len(data)获取列表元素总数
  2. mean(均值):调用statistics.mean(data)计算
  3. std(标准差):用statistics.stdev(data)(这是样本标准差,和Pandas默认的ddof=1规则一致;若要计算总体标准差,改用statistics.pstdev(data))
  4. min(最小值):min(data)直接返回列表最小值
  5. max(最大值):max(data)直接返回列表最大值
  6. 分位数(25%、50%、75%):
    • 50%分位数即中位数,直接用statistics.median(data)即可
    • 25%和75%分位数,纯内置实现可通过排序+线性插值完成:
      sorted_data = sorted(data)
      n = len(sorted_data)
      # 计算25%分位数
      q25_pos = (n - 1) * 0.25
      if q25_pos.is_integer():
          q25 = sorted_data[int(q25_pos)]
      else:
          lower_idx = int(q25_pos)
          q25 = sorted_data[lower_idx] + (sorted_data[lower_idx+1] - sorted_data[lower_idx]) * (q25_pos - lower_idx)
      # 计算75%分位数
      q75_pos = (n - 1) * 0.75
      if q75_pos.is_integer():
          q75 = sorted_data[int(q75_pos)]
      else:
          lower_idx = int(q75_pos)
          q75 = sorted_data[lower_idx] + (sorted_data[lower_idx+1] - sorted_data[lower_idx]) * (q75_pos - lower_idx)
      
    • 若允许使用NumPy,直接调用numpy.quantile(data, [0.25, 0.5, 0.75])更简洁,结果和Pandas完全对齐

完整示例代码

import statistics

def describe(data):
    if not data:
        raise ValueError("数据列表不能为空")
    sorted_data = sorted(data)
    n = len(data)
    
    count = n
    mean = statistics.mean(data)
    std = statistics.stdev(data)
    min_val = min(data)
    max_val = max(data)
    median = statistics.median(data)
    
    # 计算25%分位数
    q25_pos = (n - 1) * 0.25
    if q25_pos.is_integer():
        q25 = sorted_data[int(q25_pos)]
    else:
        lower_idx = int(q25_pos)
        q25 = sorted_data[lower_idx] + (sorted_data[lower_idx+1] - sorted_data[lower_idx]) * (q25_pos - lower_idx)
    
    # 计算75%分位数
    q75_pos = (n - 1) * 0.75
    if q75_pos.is_integer():
        q75 = sorted_data[int(q75_pos)]
    else:
        lower_idx = int(q75_pos)
        q75 = sorted_data[lower_idx] + (sorted_data[lower_idx+1] - sorted_data[lower_idx]) * (q75_pos - lower_idx)
    
    return {
        "count": count,
        "mean": mean,
        "std": std,
        "min": min_val,
        "25%": q25,
        "50%": median,
        "75%": q75,
        "max": max_val
    }

# 测试用例
test_data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
print(describe(test_data))

这个函数的输出和pandas.Series(test_data).describe()的结果基本一致,仅存在浮点数精度的细微差异。

内容的提问来源于stack exchange,提问作者Droid-Bird

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:45:43