分位数计算原理参见《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)
Out[2]: 3.0
df['a'].quantile(0.8)
Out[3]: 3.0
2、精度问题
但是无论是pandas的quantile还是numpy的quantile,尤其是在原数据位数很长时,会有如下这样一个精度问题,这就造成有时候我想找>=分位数的一些数据却不能如愿。 由于只会在最后几位会有些毛病,我的处理是:如果前6位的数据相同,则判定为相等。(这个取几位数看你自己需求哈,我觉得6位数够了) 即
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
"""
high_idx = dat[dat[by_metric].round(6) >= dat[by_metric].quantile(0.9).round(6)].index
dat_high = dat.loc[high_idx]
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
|