Python 如何选择列数可变的匹配行?
所以我有一个数据框,其中列的数量是可变的。我只想保留那些列的子集匹配的行 例如:Python 如何选择列数可变的匹配行?,python,pandas,dataframe,filter,match,Python,Pandas,Dataframe,Filter,Match,所以我有一个数据框,其中列的数量是可变的。我只想保留那些列的子集匹配的行 例如: 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,
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
我只希望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的所有类都需要具有相同的值。什么是有效的方法?使用
过滤器和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
使用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
Zero用.nunique(轴=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]
替换为您想要的任何值)或其他逻辑条件,这可能会很有用。Zero用.nunique(axis=1)给出的答案。等式(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]
替换为您想要的任何值)或其他逻辑条件,这可能会很有用。查看此查看此查看此查看谢谢!这两个答案都非常有用,而且这两种方法都有效,但是您的代码似乎比Zero的运行速度快得多,这在我的例子中非常重要:)这是否独立于@Zero的代码中所必需的预过滤(将所有不称为类*
)呢?其实我有点惊讶,谢谢!这两个答案都非常有用,而且这两种方法都有效,但是您的代码似乎比Zero的运行速度快得多,这在我的例子中非常重要:)这是否独立于@Zero的代码中所必需的预过滤(将所有不称为类*
)呢?我其实有点惊讶。