我有一个数据帧,df,类似于下面的那个。
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
答案 0 :(得分: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))
答案 1 :(得分:2)
改为使用字典。
my_grad={'A': 4.0, 'B' : 3.0}
df['new_grades']=df.GRADE.map(my_grad)
答案 2 :(得分:1)
我强烈建议使用python字典来存储成绩值。它将消除对循环的需要。
至于为什么它不起作用,想想你的循环在做什么。对于每个年级,它首先检查成绩是否为'A +',因为这是成绩的第一个条目。然后,因为它不是,它直接到else语句并返回2.3。尝试使用else语句只打印一些内容或完全删除else语句。只要确保你摆脱了else中的return语句。