所以我有一个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的所有类都需要具有相同的值。什么是有效的方法?
答案 0 :(得分:3)
使用filter
和nunique
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]
替换为所需的任何值)或其他逻辑条件即可。