You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:38:53