如何在pandas中获取使用drop方法删除的99分位数以上的数值
Pandas提取高于99分位数的被删除数值方法
你原有代码存在两处需要修正的问题:
- 变量名冲突:你预先定义了
features为目标列列表,但循环变量也用了features,会覆盖原有列表,且循环会遍历整个df的所有列,不会限制在你指定的两列范围内 - 分位数计算偏差:如果提前逐列删行,后续列计算99分位数是基于已经裁剪过的数据集,不是原始数据集的分位数,结果会和预期不符
你可以按照先计算分位数、再标记异常值、最后拆分数据的逻辑实现需求,参考代码如下:
import pandas as pd # 指定需要处理的目标列 features = ['HYG_FT01', 'HYG_PU12_PW_PV'] # 第一步:基于原始数据集计算所有目标列的99分位数 q99_map = df[features].quantile(q=0.99, numeric_only=True).to_dict() # 第二步:新增单独列存储对应列的被删除值,正常值位置填充空值 for col in features: # 大于99分位数的保留原值,其余位置填NA df[f'{col}_deleted'] = df[col].where(df[col] > q99_map[col], other=pd.NA) # 第三步:可选操作,拆分清洗后的数据集和被删除的数据集 # 提取所有包含被删除值的行 deleted_df = df[df[[f'{col}_deleted' for col in features]].notna().any(axis=1)].copy() # 生成清洗后的数据集 clean_df = df.drop(deleted_df.index).copy() # 如果不需要在清洗后的数据里保留deleted列,可执行以下代码删除 clean_df = clean_df.drop(columns=[f'{col}_deleted' for col in features])
如果你确实需要保持原有逐列裁剪的逻辑(即第一列裁剪后的数据集再计算第二列的分位数),只需要把分位数计算的步骤放到循环内,每处理完一列更新一次df即可,异常值标记的逻辑保持不变。
内容的提问来源于stack exchange,提问作者bazinga
相关产品推荐
相关产品推荐

