比较熊猫数据框中的多列

时间:2019-05-09 13:54:06

标签: pandas

我想比较数据框的多列,并找到值不同的行。在示例中,我只有三列,但是我希望能够重用此过程,而不管列数或列名如何。

创建数据框的代码:

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”的内容,因为其中一列的值与其他列的值不同。

我知道关于比较多列有很多问题,但是我找不到这种情况或可以用于这种情况的代码。

2 个答案:

答案 0 :(得分:2)

使用DataFrame.neDataFrame.eqDataFrame.anyDataFrame.all进行比较以测试每行至少一个True或所有TrueDataFrame.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