条件循环:Pandas Python

时间:2017-07-26 04:38:26

标签: python pandas

关于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中实现类似的东西。

请建议。

3 个答案:

答案 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}