2017-07-26 23 views
0

pandasデータフレームの条件付きループに関する質問。関心のあるデータフレームは膨大です。私たちは、学生の名前とテストのスコアが異なる時間に列に表示されます(下記参照)。いずれかのテストでスコアが75未満の場合は失敗とみなされ、それ以外の場合は合格となります。私はそれを効率的に行うことができません。データフレーム:条件付きループ:Pandas Python

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']) 

私のアプローチ:(ジャック・Kvamの回答に基づいて変更すると)

df.test_quiz_1 > 70 

これは(^)私に特定の生徒が失敗した場所を提供します。他のテスト(df.test_quiz_2、...)についても同じことを繰り返すことができます。最後に、これらのすべてを1つの最終的な列に結合する必要があります。最後の列では、テストで失敗した場合、学生は失敗します。

編集:私は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

私は、これはあなたのニーズに合ったと思う:

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"]データフレームが一致するかどうかを調べるg関連する列(np.Nan = 0)が75より小さい。

最後に、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} 
+0

ありがとうございます。質問の編集セクションを確認してください。 –

+0

@ XingfangLee私の答えを更新しました。あなたが求めているのはこれですか? –

+0

はい。お返事をありがとうございます。 –

2

ルーピングの代わりに、numpyから継承したpandasベクトル操作を使用する必要があります。例えば、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 

編集:

 0  1  2 
0 True True False 
1 True True True 
2 True False False 
3 True False True 
4 True False False 
:あなたは5学生との3つの試験があり、boolean型のデータフレームとしてそれを表現するとしましょう継続

すべてのテストに合格した場合は合格となりますので、df.all(axis=1)を実行してすべてのテストに合格したかどうかを確認します。

0 False 
1  True 
2 False 
3 False 
4 False 
dtype: bool 

このケースでは、学生1だけが合格しました。

+0

感謝。私はあなたの答えに基づいて質問を修正しました。ご意見をお聞かせください。 –

+0

もう一度ありがとうございます。データフレームに追加の列を作成することはできません(上記ブール値のデータフレームのRef。0,1,2)。 –

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 
関連する問題