Pandas如何筛选指定列值全部相同的行?支持任意数量列
解决方法:提取DataFrame中任意指定列值全部相同的行
没问题,我来帮你搞定这个需求——要从DataFrame里筛选出任意数量指定列值完全相同的行对吧?直接链式写多个==确实行不通(比如df['col1'] == df['col2'] == df['col3']会因为布尔Series和数值的比较报错),这里给你几个简洁且通用的方法:
方法一:用Pandas原生方法(最推荐)
核心思路是:先取出目标列,然后让每一列都和第一列比较,最后筛选出所有列都和第一列相等的行。
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'A': [1, 2, 3, 4], 'B': [1, 2, 3, 5], 'C': [1, 2, 4, 4], 'D': [1, 3, 3, 4] }) # 你要指定的列列表(任意数量) target_cols = ['A', 'B', 'C'] # 筛选逻辑 filtered_df = df[df[target_cols].eq(df[target_cols].iloc[:, 0], axis=0).all(axis=1)] print(filtered_df)
代码解释:
df[target_cols]:先提取你关注的所有列eq(df[target_cols].iloc[:, 0], axis=0):让每一列都和目标列的第一列(iloc[:,0])按行比较,生成一个布尔DataFrame,每个单元格表示当前列的值是否等于第一列对应行的值.all(axis=1):按行判断所有布尔值是否为True,也就是当前行的所有目标列值都和第一列相同,最终得到一个布尔Series- 用这个布尔Series去索引原DataFrame,就得到了所有目标列值完全相同的行
运行上面的代码,输出会是:
A B C D 0 1 1 1 1 1 2 2 2 3
方法二:基于Numpy的广播实现
如果习惯用Numpy操作,也可以用数组广播来实现,原理和上面一致:
import numpy as np # 同样的目标列和示例DataFrame target_cols = ['A', 'B', 'C'] col_values = df[target_cols].values # 筛选逻辑:所有列的值等于第一列的值 filtered_df = df[(col_values == col_values[:, [0]]).all(axis=1)]
扩展:自定义基准列
如果不想以第一列为基准,而是指定某一列作为参考(比如以D列为基准,筛选其他列和D列相同的行),可以直接修改eq的对比对象:
target_cols = ['A', 'B', 'C'] base_col = 'D' filtered_df = df[df[target_cols].eq(df[base_col], axis=0).all(axis=1)]
处理空值(NaN)的情况
默认情况下,NaN == NaN会返回False,如果想把所有列都是NaN的行也纳入筛选结果,可以加上空值判断:
# 同时满足「所有列值相同」或「所有列都是NaN」 mask = df[target_cols].isna().all(axis=1) | df[target_cols].eq(df[target_cols].iloc[:,0], axis=0).all(axis=1) filtered_df = df[mask]
内容的提问来源于stack exchange,提问作者Liam Pieri
相关产品推荐
相关产品推荐

