如何筛选Pandas DataFrame中至少N列值相同的行?
解决方法:筛选至少N列值相同的行
这问题我之前也碰到过,其实核心思路就是统计每行里重复次数最多的值出现了多少次,只要这个次数≥N,就把该行保留下来。下面给你两种实现方式,分别适合小数据和大数据场景:
方法一:简洁易读的Pandas原生实现
这个方法用apply配合value_counts,代码直观,容易理解:
import pandas as pd def filter_rows_by_n_same_cols(df, N): # 对每行计算各值的出现次数,取最大值 max_repeat = df.apply(lambda row: row.value_counts().max(), axis=1) # 筛选出重复次数≥N的行 return df[max_repeat >= N]
测试你的示例数据
先构造你给出的DataFrame:
data = { 'A': [1,5,3,5,1], 'B': [1,4,4,5,2], 'C': [1,2,3,5,1], 'D': [3,1,2,5,2], 'E': [5,2,3,4,1] } df = pd.DataFrame(data)
当N=3时:
filter_rows_by_n_same_cols(df, 3)
返回结果正好是行0、2、3、4,符合预期;
当N=4时:
filter_rows_by_n_same_cols(df, 4)
仅返回行3,完全正确。
方法二:大数据量下的加速版(Numpy实现)
如果你的DataFrame行数很多,apply的效率可能不够高,这时候可以用Numpy的bincount来加速计算:
import numpy as np def filter_rows_by_n_same_cols_fast(df, N): arr = df.to_numpy() # 对每行用bincount统计元素出现次数,取最大值 max_repeat = np.array([np.bincount(row).max() for row in arr]) return df[max_repeat >= N]
这个方法的速度比纯Pandas实现快不少,适合处理十万级以上的行数据。
思路说明
不管哪种方法,核心逻辑都是:
- 对每一行,统计每个值出现的次数
- 找到该行中出现次数最多的值的频次
- 判断这个频次是否≥N,是则保留该行
这样就完美覆盖了你需要的任意N的场景啦~
内容的提问来源于stack exchange,提问作者NeonBlueHair




