如何在可变列数匹配的熊猫中选择行?

时间:2018-09-03 15:33:27

标签: python pandas dataframe filter match

所以我有一个pandas数据框,其中列数是可变的。我只想保留那些列的子集匹配的行。

一个例子:

Name, Surname, Class1, Class2, Class3
John  Smith       1       1      -1   
Ned   Walker     -1      -1      -1
Walter White      1       1       1

在此数据框中,我只想保留Class1,Class2和Class3匹配的行,因此输出为:

Name, Surname, Class1, Class2, Class3
Ned   Walker     -1      -1      -1
Walter White      1       1       1

但是,有时“类”列的数量从1到4不等,所以我可以获得这样的数据框:

Name, Surname, Class1, Class2
John  Smith       1       1
Ned   Walker     -1      -1
Walter White      1       1

我只希望Class1和Class2匹配。或这样:

Name, Surname, Class1, Class2, Class3, Class4
John  Smith       1       1      -1      1
Ned   Walker     -1      -1      -1      1
Walter White      1       1       1      1

从1到4的所有类都需要具有相同的值。什么是有效的方法?

2 个答案:

答案 0 :(得分:3)

使用filternunique

In [808]: df[df.filter(like='Class').nunique(1).eq(1)]
Out[808]:
     Name Surname  Class1  Class2  Class3  Class4
2  Walter   White       1       1       1       1

详细信息

In [809]: df
Out[809]:
     Name Surname  Class1  Class2  Class3  Class4
0    John   Smith       1       1      -1       1
1     Ned  Walker      -1      -1      -1       1
2  Walter   White       1       1       1       1

In [810]: df.filter(like='Class')
Out[810]:
   Class1  Class2  Class3  Class4
0       1       1      -1       1
1      -1      -1      -1       1
2       1       1       1       1

In [811]: df.filter(like='Class').nunique(1)
Out[811]:
0    2
1    2
2    1
dtype: int64

In [812]: df.filter(like='Class').nunique(1).eq(1)
Out[812]:
0    False
1    False
2     True
dtype: bool

答案 1 :(得分:1)

Zero用.nunique(axis=1).eq(1)回答显然是最简单的方法,但也可以作为将来参考:

import pandas as pd
import numpy as np

np.random.seed(seed=42)
df = pd.DataFrame(np.random.randint(0,2,size=(10,3)))
print(df)
print('\n')
print(df.loc[np.all([df[col] == df.iloc[:,0] for col in df],axis=0)])

如果您发现自己需要检查,例如,这可能很有用。特定值(只需将df.iloc[:,0]替换为所需的任何值)或其他逻辑条件即可。