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

如何在Pandas DataFrame中多列对比找出值不同的行

找出DataFrame中存在不同值的行(适配任意列数)

问题描述

你有一个以column_name为索引的DataFrame,想要筛选出那些在任意列中存在不同值的行(比如示例中的a_code行),但尝试用~df.all(axis=1)没有得到预期结果,同时希望代码能适配任意列数和列名。

你的DataFrame创建代码:

import pandas as pd

data = {'column_name': {0: 'a_desc', 1: 'a_code', 2: 'b_desc', 3: 'b_code', 4: 'fiscal_year'}, 
        '20190508-131122': {0: 250.0, 1: 50.0, 2: 100.0, 3: 250.0, 4: 20.0}, 
        '20190508-151756': {0: 250.0, 1: 51.0, 2: 100.0, 3: 250.0, 4: 20.0}, 
        '20190509-074713': {0: 250.0, 1: 50.0, 2: 100.0, 3: 250.0, 4: 20.0}}
df = pd.DataFrame(data)
df = df.set_index('column_name')

生成的DataFrame:

20190508-131122  20190508-151756  20190509-074713
column_name                                                    
a_desc                  250.0            250.0            250.0
a_code                   50.0             51.0             50.0
b_desc                  100.0            100.0            100.0
b_code                  250.0            250.0            250.0
fiscal_year              20.0             20.0             20.0

你尝试的代码:

matched = ~df.all(axis=1)
df.loc[matched]

但返回空结果,预期应该得到a_code行。

问题分析

df.all(axis=1)的作用是检查每行的所有元素是否为布尔值True,而你的DataFrame里是数值类型,非零数值都会被视为True,所以每行的all(axis=1)结果都是True,取反后全为False,自然筛选不到目标行。你真正需要的是检查每行的元素是否存在不同值,而不是是否为True。

解决方案

使用nunique(axis=1)方法,它会计算每行中不同值的数量,当数量大于1时,说明该行存在不同值。这个方法完全适配任意列数和列名,不需要修改代码:

完整代码

import pandas as pd

# 创建DataFrame
data = {'column_name': {0: 'a_desc', 1: 'a_code', 2: 'b_desc', 3: 'b_code', 4: 'fiscal_year'}, 
        '20190508-131122': {0: 250.0, 1: 50.0, 2: 100.0, 3: 250.0, 4: 20.0}, 
        '20190508-151756': {0: 250.0, 1: 51.0, 2: 100.0, 3: 250.0, 4: 20.0}, 
        '20190509-074713': {0: 250.0, 1: 50.0, 2: 100.0, 3: 250.0, 4: 20.0}}
df = pd.DataFrame(data)
df = df.set_index('column_name')

# 筛选存在不同值的行
has_different_values = df.nunique(axis=1) > 1
result = df.loc[has_different_values]

print(result)

输出结果

20190508-131122  20190508-151756  20190509-074713
column_name                                                    
a_code                   50.0             51.0             50.0

补充说明

  • nunique(axis=1):按行计算不同值的数量,axis=1表示横向(行)方向计算,axis=0是纵向(列)方向。
  • 这个方法不需要指定具体列名,不管你的DataFrame有多少列、列名是什么,都能正确筛选出存在不同值的行。
  • 如果需要处理缺失值,可以添加dropna=False参数到nunique中,比如df.nunique(axis=1, dropna=False) > 1,这样会把NaN视为一个独立的值。

内容的提问来源于stack exchange,提问作者Dread

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:27:05