gpt4 book ai didi

python - 选择多列并根据列表删除值

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:19 25 4
gpt4 key购买 nike

我有一个如下所示的数据框:

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

到目前为止我可以通过

获得 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创建一个包含所有分配值的子数据框。然后,您可以将 isinall 一起使用来识别哪些包含所有目标测试值(为行指定 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

将 bool 索引分配给掩码会更有效,如下所示:

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

关于python - 选择多列并根据列表删除值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33883268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com