如何基于另一DataFrame实现关联?学生成绩映射技术咨询
解决DataFrame批量映射学生分数的问题
没问题,我来帮你搞定这个批量映射的需求!你之前的代码只能处理单个列,我们可以通过批量处理所有学生列,再拼接结果的方式实现你的目标。
第一步:先复现你的数据
首先我们用pandas创建你给出的两个DataFrame,方便后续操作:
import pandas as pd # 学生批次详情DataFrame df1 = pd.DataFrame({ 's1': ['Stud1', 'Stud2', 'Stud1'], 's2': ['Stud2', 'Stud4', 'Stud3'], 's3': ['Stud3', 'Stud1', 'Stud4'] }) # 分数信息DataFrame df2 = pd.DataFrame({ 'Name': ['Stud1', 'Stud2', 'Stud3', 'Stud4'], 'Point': [90, 80, 95, 55], 'Category': ['Good', 'Average', 'Good', 'Poor'] })
第二步:构建学生-分数映射关系
我们先把df2转换成一个可以快速查找的映射Series,这样后续映射效率更高:
# 以学生名为索引,分数为值,构建映射 score_mapping = df2.set_index('Name')['Point']
第三步:批量映射并拼接结果
接下来我们对df1的所有列批量应用映射,生成对应的分数DataFrame,再和原DataFrame横向拼接:
# 对df1的每一列做分数映射 score_df = df1.apply(lambda col: col.map(score_mapping)) # 把原学生列和分数列横向拼接 result = pd.concat([df1, score_df], axis=1)
运行后你会得到想要的结果:
s1 s2 s3 s1 s2 s3 0 Stud1 Stud2 Stud3 90 80 95 1 Stud2 Stud4 Stud1 80 55 90 2 Stud1 Stud3 Stud4 90 95 55
可选:给分数列重命名
如果你想给分数列起不同的名字(比如避免和原列名重复),可以修改分数DataFrame的列名:
score_df.columns = ['score1', 'score2', 'score3'] result = pd.concat([df1, score_df], axis=1)
这样结果会变成:
s1 s2 s3 score1 score2 score3 0 Stud1 Stud2 Stud3 90 80 95 1 Stud2 Stud4 Stud1 80 55 90 2 Stud1 Stud3 Stud4 90 95 55
为什么你之前的代码只能逐个处理?
你之前的代码只针对单个列(p1)做了映射,然后替换掉原列,这种方式只能处理单列。而我们通过apply批量处理所有列,再拼接的方式,就能一次性完成所有学生的分数映射啦。
内容的提问来源于stack exchange,提问作者Dev Ananth
相关产品推荐
相关产品推荐

