我有一个DataFrame
,其中一栏是成绩数据。其范围从A+
,A
,A-
等一直到F
。这些是形式类别。我想将它们有效地转换成数字,以便最好的成绩得到最高的数字。由于存在13个等级,因此A+
的值为13,F
的值为1
。
例如(但使用类别而不是字符串):
grades = ['A+', 'C-', 'F', 'B', 'D-']
students = ['billy', 'bob', 'joe', 'tom', 'jamal']
pd.DataFrame(columns = ['grades'], data = grades, index = students )
我想将此grades1
的{{1}}列转换为从DataFrame
到1
的数值,对应于13
和F
。我不太确定该怎么做。 A
编辑:这也是多索引数据框。第一个索引是日期,第二个索引是名称,然后是值。
答案 0 :(得分:2)
您可能想做的是建立一个字典,将每个字母等级映射到一个值。
您可以明确地做到这一点:
gradevalues = {'A+': 13, 'A': 12, …, 'F': 1}
但是最好以编程方式进行操作,因为重复少意味着打错字的位置更少:
grades = 'A+ A A- B+ B B- C+ C C- D+ D D- F'.split()
grades.reverse()
gradevalues = {grade: i for i, grade in enumerate(grades, 1)}
assert gradevalues['F'] == 1
assert gradevalues['A+'] == 13
答案 1 :(得分:2)
将这些值声明为“分类项目”后,大多数问题都会消失。
s = pd.Series(['C+', 'A+', 'D+', 'D', 'D', 'A+', 'C', 'D+', 'C+', 'A+', 'A-', 'F',
'B', 'D+', 'D-', 'A+', 'A+', 'D-', 'A', 'B-'])
cats = 'A+ A A- B+ B B- C+ C C- D+ D D- F'.split()[::-1]
s = pd.Categorical(s, categories=cats, ordered=True)
s.codes + 1
array([ 7, 13, 4, 3, 3, 13, 6, 4, 7, 13, 11, 1, 9, 4, 2, 13, 13,
2, 12, 8], dtype=int8)