我想比较数据框的多列,并找到值不同的行。在示例中,我只有三列,但是我希望能够重用此过程,而不管列数或列名如何。
创建数据框的代码:
dict = {'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(dict)
df = df.set_index('column_name')
数据框
column_name 20190508-131122 20190508-151756 20190509-074713
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”的内容,因为其中一列的值与其他列的值不同。
我知道关于比较多列有很多问题,但是我找不到这种情况或可以用于这种情况的代码。
答案 0 :(得分:2)
使用DataFrame.ne
或DataFrame.eq
与DataFrame.any
或DataFrame.all
进行比较以测试每行至少一个True
或所有True
, DataFrame.iloc
用于选择第一列:
matched = df.ne(df.iloc[:, 0], axis=0).any(axis=1)
df = df.loc[matched]
print (df)
20190508-131122 20190508-151756 20190509-074713
column_name
a_code 50.0 51.0 50.0
或者:
matched = df.eq(df.iloc[:, 0], axis=0).all(axis=1)
df = df.loc[~matched]
答案 1 :(得分:2)
IIUC nunique
将返回每行唯一的数字,在这种情况下,您需要选择大于1的数字,因此每行至少要有一个不同于其他值
df[df.nunique(1).ne(1)]
Out[331]:
20190508-131122 20190508-151756 20190509-074713
column_name
a_code 50.0 51.0 50.0