2016-06-21 24 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 

我只是想將字母等級(GRADE)轉換爲成績平均值。

我寫了下面的代碼,它總是返回所有行的異常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聲明False因爲檔次不A+,所以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語句。

相關問題