如何在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
相关产品推荐
相关产品推荐

