python - 如何将循环转换为函数
问题描述
我有 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})
如何创建一个可以更有效地执行此操作的函数?
解决方案
使用 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]
推荐阅读
- sql-server - 如何用序列号集替换 Studio 中列中的随机值?
- macos - 如何在 DMG 安装程序中使用 Chef Omnibus 创建 Mac OS .app 包
- swift - 如何将 Xcode Playground 更改为特定的 Swift 版本?
- sql - 为什么读取器对象中的索引超出范围错误
- html - 为什么我的下拉菜单没有在我的页面上完全展开?
- json - 反序列化“oneOf”结构的 Json 数组
- r - 拆分 data.frame 行并打乱它们的顺序
- azure-devops - 除了访问令牌 (PAT) 之外,还有其他方法可以对 Azure Devops CLI 进行身份验证吗?
- .net - MonoDevelop 与 Unity 2018.3.1 和 .NET 4.X
- c# - 启用省电模式时 Xamarin.Android 应用程序崩溃