You need to enable JavaScript to run this app. 如何逐列过滤DataFrame,仅保留各列90分位内的取值对应行
优惠活动
大模型
产品
解决方案
定价
更多

如何逐列过滤DataFrame,仅保留各列90分位内的取值对应行

分类列的分位过滤实现代码

针对场景中字符串类别的列特征,90分位判定的核心逻辑是逐列统计每个取值的出现频次,以频次分布计算90分位阈值,仅保留所有列的取值都处于该阈值以上的对应行。

实现步骤

  1. 初始化原始待处理DataFrame
import pandas as pd

d = {'fruit': ['apple', 'apple', 'apple', 'orange'], 'names': ['bob', 'bob', 'bob', 'joe']}
df = pd.DataFrame(data=d)
  1. 逐列执行分位过滤的核心计算
# 初始化行选择掩码,默认所有行都纳入筛选范围
keep_mask = pd.Series(True, index=df.index)

for col in df.columns:
    # 统计当前列每个取值的出现频次
    freq = df[col].value_counts()
    # 计算频次分布的90分位作为筛选阈值
    quantile_threshold = freq.quantile(0.9)
    # 筛选出当前列中频次满足要求的合法取值
    allowed_values = freq[freq >= quantile_threshold].index
    # 更新掩码:只有当前列取值在合法范围内的行才保留
    keep_mask &= df[col].isin(allowed_values)

# 应用掩码得到过滤后的结果
filtered_df = df[keep_mask]

结果验证

运行代码后得到的filtered_df和预期结果完全匹配:

fruit names
0  apple   bob
1  apple   bob
2  apple   bob

具体判定过程拆解:

  • 遍历fruit列时,统计得到apple出现3次、orange出现1次,对应频次序列计算90分位阈值为2.8,仅apple满足频次≥阈值的要求
  • 遍历names列时,统计得到bob出现3次、joe出现1次,同理解得阈值为2.8,仅bob满足频次≥阈值的要求
  • 两个列的合法取值范围取交集后,仅前3行同时满足两个列的取值要求,被最终保留

注意:如果待处理的列是数值类型,不需要按出现频次计算分位,直接对列本身的原始取值计算90分位阈值,保留取值≥阈值的行即可,不要和分类列的频次统计逻辑混淆。


内容的提问来源于stack exchange,提问作者justanewb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 11:27:04