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

2024-06-10 23:15:17 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个列数可变的数据帧。我只想保留那些列的子集匹配的行。你知道吗

举个例子:

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

但是,有时“Class”列的数量从1到4不等,因此我可以得到如下数据帧:

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

我只希望1班和2班匹配。或者这个:

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的所有类都需要具有相同的值。什么是有效的方法?你知道吗


Tags: 数据namesurnamejohn子集例子smithwalker
2条回答

使用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

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]替换为您想要的任何值)或其他逻辑条件,这可能会很有用。你知道吗

相关问题 更多 >