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

所以我有一个 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 的所有类都需要具有相同的值。什么是一种有效的方法来做到这一点?


ibeautiful
浏览 161回答 2
2回答

慕雪6442864

Zero 的回答.nunique(axis=1).eq(1)显然是最熊猫式的方法,但为了将来参考,这也有效:import pandas as pdimport numpy as npnp.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]您想要的任何值)或其他逻辑条件,这可能会很有用。

拉丁的传说

使用filter和nuniqueIn [808]: df[df.filter(like='Class').nunique(1).eq(1)]Out[808]:     Name Surname  Class1  Class2  Class3  Class42  Walter   White       1       1       1       1细节In [809]: dfOut[809]:     Name Surname  Class1  Class2  Class3  Class40    John   Smith       1       1      -1       11     Ned  Walker      -1      -1      -1       12  Walter   White       1       1       1       1In [810]: df.filter(like='Class')Out[810]:   Class1  Class2  Class3  Class40       1       1      -1       11      -1      -1      -1       12       1       1       1       1In [811]: df.filter(like='Class').nunique(1)Out[811]:0    21    22    1dtype: int64In [812]: df.filter(like='Class').nunique(1).eq(1)Out[812]:0    False1    False2     Truedtype: bool
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python