如何逐列过滤DataFrame,仅保留各列90分位内的取值对应行
分类列的分位过滤实现代码
针对场景中字符串类别的列特征,90分位判定的核心逻辑是逐列统计每个取值的出现频次,以频次分布计算90分位阈值,仅保留所有列的取值都处于该阈值以上的对应行。
实现步骤
- 初始化原始待处理DataFrame
import pandas as pd d = {'fruit': ['apple', 'apple', 'apple', 'orange'], 'names': ['bob', 'bob', 'bob', 'joe']} df = pd.DataFrame(data=d)
- 逐列执行分位过滤的核心计算
# 初始化行选择掩码,默认所有行都纳入筛选范围 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
相关产品推荐
相关产品推荐

