首页 > 解决方案 > 如何将循环转换为函数

问题描述

我有 2 个数据框:
分数

    grade  score
0     A      90
1     B      80
2     C      70
3     D      60

学生

    name   grades
0   Adam   [A, B, A, F]
1   Jane   [C, B, A, F]

我想添加一个新列,其中包含每个年级的分数,如下所示:

grades_list = []
for student in students['grades']:
     grades_list2 = []
     for grade in student:
          try:
               grades_list2.append(score.loc[score['grade'] == grade, 'score'].iloc[0])
          except:
               grades_list2.append(0)
     grades_list.append(grades_list2)

students['score'] = pd.DataFrame({'score': grades_list})

如何创建一个可以更有效地执行此操作的函数?

标签: pythonfunctiondataframe

解决方案


使用 Pandas apply高效处理 Pandas 系列的每一行(即比 Python for 循环更快)

代码

def convert_grades(grades):
  ' Convert list of letter grades to numbers '
  # Convert string list to list (e.g. "[A, B]" -> ["A", "B"])
  grades = grades[1:-1].split(',')

  # Map grades with default of 0 for grades not in dictionary
  return [map_grades.get(g.strip(), 0) for g in grades]

# Create dictionary to map grades to numbers using DataFrame columns
# grade and score of df_grades
map_grades = df_grades.set_index('grade').to_dict()['score']

# Use apply which applies function convert_grades to the grades column
students['score'] = students['grades'].apply(convert_grades)

df_grades

  grade  score
0     A     90
1     B     80
2     C     70
3     D     60

学生

  name        grades
0  Adam  [A, B, A, F]
1  Jane  [C, B, A, F]

结果

  name        grades            score
0  Adam  [A, B, A, F]  [90, 80, 90, 0]
1  Jane  [C, B, A, F]  [70, 80, 90, 0]

推荐阅读