You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:51:13