关于pandas数据帧的条件循环的问题。感兴趣的数据框架是巨大的。我们在不同时间的专栏中有学生姓名和考试成绩(请参阅下文)。如果学生在任何考试中得分低于75分,则视为失败,否则通过。我无法有效地做到这一点。数据帧:
score = {'student_name': ['Jiten', 'Jac', 'Ali', 'Steve', 'Dave', 'James'],
'test_quiz_1': [74, 81, 84, 67, 59, 96],
'test_quiz_2': [76, np.NaN, 99, 77, 53, 69],
'test_mid_term': [76, 88, 84, 67, 58, np.NaN],
'test_final_term': [76, 78, 89, 67, 58, 96]}
df = pd.DataFrame(score, columns = ['student_name', 'test_quiz_1', 'test_quiz_2', 'test_mid_term', 'test_final_term'])
我的方法:(根据Jacques Kvam的答案进行修改)
df.test_quiz_1 > 70
这(^)给了我特定学生失败的位置。对于其他测试(df.test_quiz_2,...),可以重复相同的操作。最后,我需要将这些全部合并到一个最后一栏中,如果学生在任何测试中失败,他们将失败。
编辑:我对python和pandas知之甚少。我正在编写关于如何在C / C ++中实现的伪代码。
for student in student_list:
value=0
for i in range (no_of_test):
if (score<75):
value=value+1
else:
continue
if(value>0):
student[status]=fail
else:
student[status]=pass
上面只是一个伪代码。我没有创建任何额外的专栏来标记学生是否在任何考试中失败。是否可以使用Pandas在Python中实现类似的东西。
请建议。
答案 0 :(得分:2)
您应该使用从numpy继承的pandas vector操作,而不是循环。例如,标记通过test_quiz_1
的人:
df.test_quiz_1 > 70
,并提供:
0 True
1 True
2 True
3 False
4 False
5 True
Name: test_quiz_1, dtype: bool
编辑:继续假设您有5个学生进行了3次测试并将其表示为布尔数据帧:
0 1 2
0 True True False
1 True True True
2 True False False
3 True False True
4 True False False
如果学生通过了所有测试,他们就会通过,所以我们可以运行df.all(axis=1)
来检查他们是否通过了所有测试,这给出了:
0 False
1 True
2 False
3 False
4 False
dtype: bool
在这种情况下只有学生1通过。
答案 1 :(得分:1)
df.set_index('student_name').lt(75).any(1)
# `lt` is the method version of `<`
# this identifies students that received
# a score less than 75 on any of the tests.
student_name
Jiten True
Jac False
Ali False
Steve True
Dave True
James True
dtype: bool
答案 2 :(得分:0)
我认为这符合您的需求:
cols = df.columns.drop("student_name").tolist()
df["PassOrFail"] = df[cols].fillna(0).lt(75).any(1)
for i in cols:
df[i+"_"] = df[i].fillna(0).lt(75)
<强>解释强>
首先,我们创建一个包含相关列的列表:
['test_quiz_1', 'test_quiz_2', 'test_mid_term', 'test_final_term']
然后我们创建一个新的col [“PassOrFail”],它检查包含相关列(np.Nan = 0)的数据帧是否低于75.
最后为每个相关列创建一个具有True或False值的新列。
<强>更新强>
假设我们只对获得True或False感兴趣,那么以下代码就足够了:
cols = df.columns.drop("student_name").tolist()
results = df[cols].fillna(0).lt(75).any(1).tolist()
(~pd.Series(results,index=df["student_name"])).to_dict()
输出:
{'Ali': True,
'Dave': False,
'Jac': False,
'James': False,
'Jiten': False,
'Steve': False}