我有一个看起来像这样的数据框:
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
我想选择Assignment
仅限于此列表的值:
[-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
我到目前为止可以correct_values
通过
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)。
target_test_values = [-3, 0, 2, 4, 7, 10, 12]
>>> df[df.loc[:, ['Assignment1', 'Assignment2', 'Assignment3']]
.isin(target_test_values).all(axis=1)]
StudentID Name Assignment1 Assignment2 Assignment3
0 s1 user1 7 7 -3
2 s3 user3 12 10 10
或者,假设您有三个作业:
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)]
为了获得错误值,您只需要使用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
将布尔值索引分配给掩码的效率更高,如下所示:
mask = df.iloc[:, 2:].isin(target_test_values).all(axis=1)
correct_values = df[mask]
error_values = df[~mask]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句