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

DataFrame分组均值对应百分位数计算报错,求问题排查与解决

问题描述

我有一个包含分类变量year、dkg、fkg以及数值变量expenditure的DataFrame。我需要先按['fkg','dkg','year']分组计算expenditure的均值,再计算每个分组均值在整个expenditure数据集中对应的百分位数,但最后一行代码运行报错,请问我哪里操作有误?

相关代码如下:

import pandas as pd
import numpy as np
from scipy import stats

创建DataFrame:

df=pd.DataFrame([])

df['year'] = np.random.randint(low=2008, high=2013, size=100000)
df['dkg'] = np.random.choice([0, 1], size=100000)
df['fkg'] = np.random.choice([0, 1], size=100000)
df['expenditure'] = np.random.choice([0, 25230], size=100000)

计算分组均值:

means = df.groupby(['fkg','dkg', 'year']).mean()
print(means)

计算各分组均值对应的百分位数(报错代码):

percentile = stats.groupby(['fkg','dkg', 'year']).percentileofscore(df[['expenditure']], means)
错误分析与修正方案

核心错误点

  • scipy.stats模块不存在groupby方法,你混淆了pandas的分组API与scipy统计函数的用法
  • stats.percentileofscore的参数格式不符合要求:第一个参数需要是一维数组(而非DataFrame),第二个参数需为单个数值或与第一个参数维度匹配的数组,你传入的means是带多级索引的DataFrame,无法直接被函数处理

修正步骤

  1. 提取整个数据集的expenditure为一维数组,简化后续计算
  2. 对分组得到的均值序列,逐值应用stats.percentileofscore函数
  3. 保留原分组均值的索引结构,保证结果对应关系正确

正确代码

# 提取整个数据集的expenditure一维数组
exp_data = df['expenditure'].values

# 计算每个分组均值对应的百分位数
percentiles = means['expenditure'].apply(lambda x: stats.percentileofscore(exp_data, x))

# 可选:将百分位数结果合并到原均值DataFrame中
means['expenditure_percentile'] = percentiles
print(means)

补充说明

  • stats.percentileofscore(exp_data, x)会计算数值x在exp_data中的百分位排名
  • 由于你的expenditure仅包含0和25230两个取值,分组均值只会是0、25230或两者的中间值,对应的百分位数也会是固定的几个结果,符合随机数据的特性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:10:31