Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何选择列数可变的匹配行?_Python_Pandas_Dataframe_Filter_Match - Fatal编程技术网

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的代码中所必需的预过滤(将所有不称为
类*
)呢?我其实有点惊讶。