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,无法直接被函数处理
修正步骤
- 提取整个数据集的expenditure为一维数组,简化后续计算
- 对分组得到的均值序列,逐值应用
stats.percentileofscore函数 - 保留原分组均值的索引结构,保证结果对应关系正确
正确代码
# 提取整个数据集的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
相关产品推荐
相关产品推荐

