Pandas DataFrame删除低频值行的最佳实践及示例
删除Pandas DataFrame低频行的最佳实践
嘿,处理这类删除低频值行的需求,Pandas里有几种高效且易维护的方法,我日常工作里最常用的是下面这两种,分享给你:
核心思路
本质就是先找出目标列中频数达到阈值的取值,再筛选出只包含这些取值的行,过滤掉低频的那些。
方法1:value_counts() + isin()(性能优先)
这种方法在处理大数据集时速度更快,代码也很简洁,是我最推荐的方案。
示例1:删除poo列中频数小于3的行
import pandas as pd # 假设你的DataFrame是df # 1. 统计poo列各值的频次 poo_freq = df['poo'].value_counts() # 2. 筛选出频次≥3的取值 keep_poo = poo_freq[poo_freq >= 3].index # 3. 过滤DataFrame,只保留符合条件的行 df_filtered_poo = df[df['poo'].isin(keep_poo)]
嫌步骤多?可以直接写成一行,可读性也不差:
df_filtered_poo = df[df['poo'].isin(df['poo'].value_counts()[df['poo'].value_counts() >= 3].index)]
示例2:删除bar列中频数小于3的行
逻辑完全一致,只需要替换列名就行:
df_filtered_bar = df[df['bar'].isin(df['bar'].value_counts()[df['bar'].value_counts() >= 3].index)]
方法2:groupby.filter()(可读性优先)
如果你的团队里有刚接触Pandas的同事,这种方法的逻辑更直观,一看就懂:按目标列分组,只保留组内行数≥阈值的组。
示例1处理poo列:
df_filtered_poo = df.groupby('poo').filter(lambda x: len(x) >= 3)
示例2处理bar列:
df_filtered_bar = df.groupby('bar').filter(lambda x: len(x) >= 3)
注意事项:处理缺失值
如果你的列里有NaN,默认value_counts()会忽略它。如果想把NaN也当作一个类别来统计(比如要保留出现≥3次的NaN行),记得加上dropna=False参数:
# 包含NaN的统计与过滤 poo_freq = df['poo'].value_counts(dropna=False) keep_poo = poo_freq[poo_freq >= 3].index df_filtered_poo = df[df['poo'].isin(keep_poo)]
方案选择建议
- 处理百万级以上的大数据集:选
value_counts()+isin(),性能更优; - 小数据集或追求代码可读性:选
groupby.filter(),逻辑清晰好维护。
内容的提问来源于stack exchange,提问作者AnonX
相关产品推荐
相关产品推荐

