Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.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 - Fatal编程技术网

Python 选择多列并根据列表删除值

Python 选择多列并根据列表删除值,python,pandas,Python,Pandas,我有一个数据框,看起来像这样: StudentID Name Assignment1 Assignment2 Assignment3 0 s1 user1 7 7 -3 1 s2 user2 2 15 10 2 s3 user3 12 10 10 3 s4 use

我有一个数据框,看起来像这样:

StudentID  Name       Assignment1 Assignment2 Assignment3
0    s1    user1           7           7           -3
1    s2    user2           2          15           10
2    s3    user3          12          10           10
3    s4    user4           6           2           10
4    s5    user5          -2           7            2
我想选择
赋值
值,仅限于此列表中的值:

[-3,0,2,4,7,10,12]
所以我想得到的结果是:

Error_values:
StudentID  Name       Assignment1 Assignment2 Assignment3
1    s2    user2           2          15           10
3    s4    user4           6           2           10
4    s5    user5          -2           7            2

Correct_values:
StudentID  Name       Assignment1 Assignment2 Assignment3
0    s1    user1           7           7           -3
2    s3    user3          12          10           10
到目前为止,我可以通过

def loadData(filename):
    raw_data = pd.read_csv(filename)
    return raw_data

def checkErrorsData(raw_data):
    df = pd.DataFrame(np.array(raw_data), columns=raw_data.columns)
    duplicated_Id = df[df.duplicated('StudentID', keep=False)]
    error_data = df[df['Assignment1'].isin([-3,0,2,4,7,10,12])]
    return duplicated_Id, error_data

但是,这需要处理每个列,如何在不键入标签的情况下对所有列执行此操作?

您可以使用
.loc
创建包含所有赋值的子数据帧。然后使用
isin
all
来识别哪些包含所有目标测试值(为行指定axis=1)

或者,假设您有三项任务:

assignments = 3
>>> df[df.iloc[:, 2:(2+1+assignments)].isin(target_test_values).all(axis=1)]
  StudentID   Name  Assignment1  Assignment2  Assignment3
0        s1  user1            7            7           -3
2        s3  user3           12           10           10
如果过去的分配没有更多的列,您可以简单地按如下方式编制索引:

df[df.iloc[:, 2:].isin(target_test_values).all(axis=1)]
mask = df.iloc[:, 2:].isin(target_test_values).all(axis=1)
correct_values = df[mask]
error_values = df[~mask]
要获得错误值,只需使用tilda(~)求反:

>>> df[~df.iloc[:, 2:].isin(target_test_values).all(axis=1)]
  StudentID   Name  Assignment1  Assignment2  Assignment3
1        s2  user2            2           15           10
3        s4  user4            6            2           10
4        s5  user5           -2            7            2
将布尔索引指定给掩码更有效,如下所示:

df[df.iloc[:, 2:].isin(target_test_values).all(axis=1)]
mask = df.iloc[:, 2:].isin(target_test_values).all(axis=1)
correct_values = df[mask]
error_values = df[~mask]

我们可以看看你的代码,看看你是否在正确的轨道是的,只是编辑它,谢谢!谢谢但是如果我有
n个赋值
,并且我不能键入所有列标签,会发生什么呢?我几乎使用了索引赋值,但为了清晰起见选择了标签。您可以使用
df[df.iloc[:,2:(2+1+n)].isin(目标测试值)。all(axis=1)]
其中
n
是分配的数量。见编辑。嘿,谢谢。它工作正常,感谢进一步的研究,我假设tilda否定也可以得到错误值。我还将包括一个稍微高效的版本。