pandas使用分位数筛选满足条件的行

pandas使用分位数筛选满足条件的行,第1张

分位数计算原理参见《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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/942542.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-18
下一篇2022-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存