Pandas教程:如何筛选两列值不同的行?
筛选DataFrame中列a与列b取值不同的行
嘿,这个需求在pandas里太常见了,我给你分享几种简单高效的实现方式,按需选用就行:
方法1:直观的布尔索引
这是最直接的写法,新手也能一眼看懂:
filtered_df = df[df['a'] != df['b']]
原理很简单:df['a'] != df['b']会生成一个布尔值的Series,其中True对应的就是列a和列b取值不同的行,用这个Series去索引原DataFrame,就能得到你要的结果。
方法2:用pandas的ne()方法(更优雅的链式写法)
ne()是not equal的缩写,和!=功能完全一致,但写法更贴合pandas的风格,处理复杂链式操作时更顺手:
filtered_df = df[df['a'].ne(df['b'])]
方法3:用query()方法(类SQL风格)
如果你习惯写SQL类的语句,query()会让代码更简洁易读:
filtered_df = df.query('a != b')
特殊情况:处理缺失值(NaN)
需要注意的是,在pandas中,NaN和任何值比较(包括和自己)都会返回False。如果你的数据里有缺失值,且希望把a或b为NaN的行也视为“取值不同”(毕竟NaN不等于任何有效数值),可以这样处理:
# 包含a≠b,或者a是NaN,或者b是NaN的行 filtered_df = df[(df['a'] != df['b']) | df['a'].isna() | df['b'].isna()]
举个实际例子
假设你的DataFrame是这样的:
import pandas as pd import numpy as np df = pd.DataFrame({ 'a': [1, 2, 3, np.nan, 5], 'b': [1, 4, 3, 3, 6] })
用上述缺失值处理的代码筛选后会得到:
a b 1 2.0 4.0 3 NaN 3.0 4 5.0 6.0
内容的提问来源于stack exchange,提问作者user1670773
相关产品推荐
相关产品推荐

