
分位数计算原理参见《python–pandas 分位数》
下面直接使用pandas的quantile方法
1、给个例子import pandas as pd
df = pd.DataFrame({'a':[3,3,3,3,3,3,3]})
sum(df["a"] == 3)
Out[1]: 7
df['a'].quantile(0.9) # 90%分位数
Out[2]: 3.0
df['a'].quantile(0.8) # 80%分位数
Out[3]: 3.0
2、精度问题
但是无论是pandas的quantile还是numpy的quantile,尤其是在原数据位数很长时,会有如下这样一个精度问题,这就造成有时候我想找>=分位数的一些数据却不能如愿。
由于只会在最后几位会有些毛病,我的处理是:如果前6位的数据相同,则判定为相等。(这个取几位数看你自己需求哈,我觉得6位数够了)
即
# 获得a列取值>=90%分位数的数据
df[df["a"].round(6) >= df["a"].quantile(0.9).round(6)]
3、最后给可用函数
def cls(dat, by_metric="a"):
"""
在by_metric列算分位数、然后按照分位数分组
:param dat: dataframe
:param by_metric:
:return: High组,Low组的dataframe
"""
# 计算大于分位数为0.9的预测值索引,记为High组
high_idx = dat[dat[by_metric].round(6) >= dat[by_metric].quantile(0.9).round(6)].index
dat_high = dat.loc[high_idx]
# 计算小于分位数为0.1的预测值索引,记为Low组
low_idx = dat[dat[by_metric].round(6) <= dat[by_metric].quantile(0.1).round(6)].index
dat_low = dat.loc[low_idx]
return dat_high , dat_low
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)