如何基于var_avg列计算百分位数以标准化困境指数(DI)?
解决困境指数(DI)标准化步骤问题
核心逻辑
根据需求,标准化步骤需将var_avg(7项排名的等权平均)按**百分位数区间(0-10%、10-20%…90-100%)**映射为0(最繁荣)到100(最困境)的指数值:
var_avg最小的10%(最繁荣)→ norm=0var_avg次小的10% → norm=10- ...
var_avg最大的10%(最困境)→ norm=100
示例代码与解释
以下用Python Pandas实现完整流程,包含样本数据生成、var_avg计算及标准化:
1. 导入依赖并生成样本数据
import pandas as pd import numpy as np # 生成100个邮政编码的样本数据(模拟已完成指标排名的结果) np.random.seed(42) sample_data = pd.DataFrame({ 'zipcode': ['10001', '10002', '10003', '10004', '10005', '10006', '10007', '10008', '10009', '10010']*10, 'var1_rank': np.random.randint(1, 101, 100), 'var2_rank': np.random.randint(1, 101, 100), 'var3_rank': np.random.randint(1, 101, 100), 'var4_rank': np.random.randint(1, 101, 100), 'var5_rank': np.random.randint(1, 101, 100), 'var6_rank': np.random.randint(1, 101, 100), 'var7_rank': np.random.randint(1, 101, 100) }) # 计算等权平均得分var_avg sample_data['var_avg'] = sample_data[[f'var{i}_rank' for i in range(1,8)]].mean(axis=1)
2. 执行标准化生成norm列
# 生成10个百分位数的划分点(0, 10%, 20%, ..., 100%) quantiles = np.linspace(0, 1, 11) # 将var_avg按百分位数分组,并映射为对应的norm值 sample_data['norm'] = pd.qcut( sample_data['var_avg'], q=quantiles, labels=[0, 10, 20, 30, 40, 50, 60, 70, 80, 100] # 10个区间对应10个标签 ) # 将norm从分类类型转为整数类型 sample_data['norm'] = sample_data['norm'].astype(int)
3. 验证结果
# 查看每个norm区间对应的var_avg范围,确认映射逻辑正确 print(sample_data.groupby('norm')['var_avg'].agg(['min', 'max']))
注意事项
- 如果你的指标排名逻辑是数值越小代表越困境(比如贫困率越低排名越小),需将标签反转:
labels=[100,90,80,...,0],确保最小的var_avg对应100(最困境),最大的对应0(最繁荣)。 - 若存在大量重复值导致
pd.qcut无法均分,可添加duplicates='drop'参数自动调整分位数,或增大样本量。
内容的提问来源于stack exchange,提问作者Ed_Gravy
相关产品推荐
相关产品推荐

