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

如何让DataFrame.describe()计算时纳入权重参数?

如何让pandas的describe()计算加权统计指标?

pandas原生的describe()方法并不支持基于权重的统计计算,要实现加权版本的描述性统计,需要手动实现相关逻辑,以下是具体步骤:

1. 原数据与问题重现

先构建你的样本DataFrame:

import pandas as pd
import numpy as np

# 创建DataFrame
sample = pd.DataFrame(
{'score':[595, 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, 583,582, 581, 580, 579, 578, 577, 576], 
'population':[ 705,  745,  716,  742,  722,  746,  796,  750,  816,  809,  815,821,  820,  865,  876,  886,  947,  949, 1018,  967]})

你已经通过np.average算出了分数的加权均值:

np.average(sample['score'], weights=sample['population'])
# 输出: 584.9062443219672

但原生sample.describe()输出的是未加权的统计结果,无法直接复用该方法实现加权计算。

2. 自定义加权描述性统计函数

下面的函数可以生成和describe()格式一致的加权统计结果,包含加权均值、标准差、分位数等指标:

def weighted_describe(df, value_col, weight_col):
    values = df[value_col]
    weights = df[weight_col]
    total_weight = weights.sum()
    
    # 计算核心加权指标
    weighted_mean = np.average(values, weights=weights)
    weighted_var = np.average((values - weighted_mean)**2, weights=weights)
    weighted_std = np.sqrt(weighted_var)
    
    # 计算加权分位数(先排序再按累积权重定位)
    sorted_idx = values.argsort()
    sorted_vals = values.iloc[sorted_idx]
    sorted_weights = weights.iloc[sorted_idx]
    cum_weight_pct = sorted_weights.cumsum() / total_weight
    
    weighted_25 = sorted_vals[cum_weight_pct >= 0.25].iloc[0]
    weighted_50 = sorted_vals[cum_weight_pct >= 0.50].iloc[0]
    weighted_75 = sorted_vals[cum_weight_pct >= 0.75].iloc[0]
    
    # 提取极值
    min_val = values.min()
    max_val = values.max()
    
    # 组装成与describe一致的结构
    result = pd.DataFrame(
        {value_col: [total_weight, weighted_mean, weighted_std, min_val, weighted_25, weighted_50, weighted_75, max_val]},
        index=['count', 'mean', 'std', 'min', '25%', '50%', '75%', 'max']
    )
    return result

3. 调用函数获取结果

执行以下代码即可得到score列的加权统计结果:

weighted_describe(sample, 'score', 'population')

输出结果示例:

score
count  16511.000000
mean     584.906244
std        5.927343
min      576.000000
25%      580.000000
50%      585.000000
75%      590.000000
max      595.000000

说明

  • 函数中的分位数计算采用"累积权重首次超过阈值取对应值"的逻辑,你可以根据需求替换为插值法等其他分位数计算方式;
  • 如果需要对多列计算加权统计,可以扩展函数逻辑,批量处理多个数值列。

内容的提问来源于stack exchange,提问作者Wizard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:35:01