2016-06-21 6 views
1

私は以下のようなデータフレームdfを持っています。レターグレードをGPAに変換する:自分のコードで何が問題になっていますか?

ID  SUBJ   GRADE 

1 Amer Natl Govt  A 
2 Princ Of Macroecon B 
3 General Biology  B 
4 Concept Of Chem  C 
5 General Chem  C 

私は文字のグレード(グレード)を学年の平均に変換したいと思います。

タプルのリストの文字のデータ型が自分のデータフレームの文字のデータ型と同じであるように、すべての行に対して常に例外2.3を返す次のコードを記述しましたが、文字列。誰かが私のコードの問題を教えてもらえますか?ありがとうございました。

def getGradePoint(row): 

    grades = [('A+', 4.0), ('A', 4.0), ('A-', 3.7), ('B+',3.3), ('B',3.0), ('B-',2.7), ('C+',2.3), ('C',2.0),\ 
      ('C-',1.7),('D+',1.3),('D',1.0),('D-',0.7),('F',0.0)] 
    for i in range(len(grades)): 
     if row == grades[i][0]: 
      return grades[i][1] 
     else: 
      return 2.3 

df['GRADE_PT'] = df['GRADE'].apply(getGradePoint) 

ID  SUBJ   GRADE GPA 

1 Amer Natl Govt  A  2.3 
2 Princ Of Macroecon B  2.3 
3 General Biology  B  2.3 
4 Concept Of Chem  C  2.3 
5 General Chem  C  2.3 

答えて

4

問題は、ループが常に最初の繰り返しで結果を返すことです。最初の反復では、タプルとして('A+', 4.0)が得られます。ifの文は、A+ではないため、Falseであるため、else文が評価され、2.3を返します。

は代わりに、ループが完了した後にのみ2.3を返す:

def getGradePoint(row): 
    grades = [('A+', 4.0), ('A', 4.0), ('A-', 3.7), ('B+',3.3), ('B',3.0), ('B-',2.7), ('C+',2.3), ('C',2.0), \ 
      ('C-',1.7),('D+',1.3),('D',1.0),('D-',0.7),('F',0.0)] 
    for i in range(len(grades)): 
     if row == grades[i][0]: 
      return grades[i][1] 

    return 2.3 

しかし、既に述べたように、それだけで辞書を使用する方が簡単です。既存の工事を使用してgrades

grades = [('A+', 4.0), ('A', 4.0), ('A-', 3.7), ('B+',3.3), ('B',3.0), ('B-',2.7), ('C+',2.3), ('C',2.0),\ 
      ('C-',1.7),('D+',1.3),('D',1.0),('D-',0.7),('F',0.0)] 
df['GRADE_PT'] = df['GRADE'].map(dict(grades)) 
2

代わりに辞書を使用してください。

my_grad={'A': 4.0, 'B' : 3.0} 

df['new_grades']=df.GRADE.map(my_grad) 
1

グレード値を保存するためにPython辞書を使用することを強くお勧めします。ループが不要になります。

なぜ動作しないのかについては、ループが何をしているのかを考えてください。各成績について、最初に成績が「A +」であるかどうかをチェックします。これは成績の最初の記入項目です。それから、そうではないので、それはelse文にまっすぐ進み、2.3を返します。 else文で何かを印刷するか、else文を完全に削除してみてください。 else内のreturn文を削除するようにしてください。

関連する問題