将短语列表转换为相应的数字
Convert list of phrases into corresponding number
我正在研究 GPA 计算器,我有一个学生在 类 中的每个成绩的列表。我需要将字母等级(A+、B- 等)转换为相应的数值(4.3、2.7 等)
这是我目前所拥有的:
import pandas as pd
import openpyxl
df = pd.read_excel('/Users/mac/Downloads/Data Doc.xlsx')
values = {'A+':'4.3', 'A':'4', 'A-':'3.7', 'B+':'3.3', 'B':'3', 'B-':'2.7', 'C+':'2.3', 'C':'2', 'C-':'1.7', 'D+':'1.3', 'D':'1', 'D-':'.7', 'F':'0'}
l = df.values.tolist()
提前感谢您的帮助
您可以使用 Series.map
根据字母生成数字成绩。例如:
import pandas as pd
df = pd.DataFrame({ 'name' : ['John', 'Ellie', 'Bill'], 'grade': ['A', 'A+', 'C-'] } )
values = {'A+':'4.3', 'A':'4', 'A-':'3.7', 'B+':'3.3', 'B':'3', 'B-':'2.7', 'C+':'2.3', 'C':'2', 'C-':'1.7', 'D+':'1.3', 'D':'1', 'D-':'.7', 'F':'0'}
df['numgrade'] = df['grade'].map(values)
输出:
name grade numgrade
0 John A 4
1 Ellie A+ 4.3
2 Bill C- 1.7
如果您不想保留 alpha 值,您可以简单地使用 replace
:
df = pd.DataFrame({ 'name' : ['John', 'Ellie', 'Bill'], 'class 1': ['A', 'A+', 'C-'], 'class 2': ['A', 'B+', 'C+'] } )
values = {'A+':'4.3', 'A':'4', 'A-':'3.7', 'B+':'3.3', 'B':'3', 'B-':'2.7', 'C+':'2.3', 'C':'2', 'C-':'1.7', 'D+':'1.3', 'D':'1', 'D-':'.7', 'F':'0'}
df = df.replace(values)
这将替换整个数据框。输出:
name class 1 class 2
0 John 4 4
1 Ellie 4.3 3.3
2 Bill 1.7 2.3
否则,您可以遍历成绩列(仅使用 filter
到 select 开头带有 class
的列)例如
df = pd.DataFrame({ 'name' : ['John', 'Ellie', 'Bill'], 'class 1': ['A', 'A+', 'C-'], 'class 2': ['A', 'B+', 'C+'] } )
values = {'A+':'4.3', 'A':'4', 'A-':'3.7', 'B+':'3.3', 'B':'3', 'B-':'2.7', 'C+':'2.3', 'C':'2', 'C-':'1.7', 'D+':'1.3', 'D':'1', 'D-':'.7', 'F':'0'}
for col in df.filter(regex='^class').columns:
df[col + ' num'] = df[col].map(values)
输出:
name class 1 class 2 class 1 num class 2 num
0 John A A 4 4
1 Ellie A+ B+ 4.3 3.3
2 Bill C- C+ 1.7 2.3
我正在研究 GPA 计算器,我有一个学生在 类 中的每个成绩的列表。我需要将字母等级(A+、B- 等)转换为相应的数值(4.3、2.7 等) 这是我目前所拥有的:
import pandas as pd
import openpyxl
df = pd.read_excel('/Users/mac/Downloads/Data Doc.xlsx')
values = {'A+':'4.3', 'A':'4', 'A-':'3.7', 'B+':'3.3', 'B':'3', 'B-':'2.7', 'C+':'2.3', 'C':'2', 'C-':'1.7', 'D+':'1.3', 'D':'1', 'D-':'.7', 'F':'0'}
l = df.values.tolist()
提前感谢您的帮助
您可以使用 Series.map
根据字母生成数字成绩。例如:
import pandas as pd
df = pd.DataFrame({ 'name' : ['John', 'Ellie', 'Bill'], 'grade': ['A', 'A+', 'C-'] } )
values = {'A+':'4.3', 'A':'4', 'A-':'3.7', 'B+':'3.3', 'B':'3', 'B-':'2.7', 'C+':'2.3', 'C':'2', 'C-':'1.7', 'D+':'1.3', 'D':'1', 'D-':'.7', 'F':'0'}
df['numgrade'] = df['grade'].map(values)
输出:
name grade numgrade
0 John A 4
1 Ellie A+ 4.3
2 Bill C- 1.7
如果您不想保留 alpha 值,您可以简单地使用 replace
:
df = pd.DataFrame({ 'name' : ['John', 'Ellie', 'Bill'], 'class 1': ['A', 'A+', 'C-'], 'class 2': ['A', 'B+', 'C+'] } )
values = {'A+':'4.3', 'A':'4', 'A-':'3.7', 'B+':'3.3', 'B':'3', 'B-':'2.7', 'C+':'2.3', 'C':'2', 'C-':'1.7', 'D+':'1.3', 'D':'1', 'D-':'.7', 'F':'0'}
df = df.replace(values)
这将替换整个数据框。输出:
name class 1 class 2
0 John 4 4
1 Ellie 4.3 3.3
2 Bill 1.7 2.3
否则,您可以遍历成绩列(仅使用 filter
到 select 开头带有 class
的列)例如
df = pd.DataFrame({ 'name' : ['John', 'Ellie', 'Bill'], 'class 1': ['A', 'A+', 'C-'], 'class 2': ['A', 'B+', 'C+'] } )
values = {'A+':'4.3', 'A':'4', 'A-':'3.7', 'B+':'3.3', 'B':'3', 'B-':'2.7', 'C+':'2.3', 'C':'2', 'C-':'1.7', 'D+':'1.3', 'D':'1', 'D-':'.7', 'F':'0'}
for col in df.filter(regex='^class').columns:
df[col + ' num'] = df[col].map(values)
输出:
name class 1 class 2 class 1 num class 2 num
0 John A A 4 4
1 Ellie A+ B+ 4.3 3.3
2 Bill C- C+ 1.7 2.3