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

如何用Pandas为成绩DataFrame添加最优成绩及对应科目列?

实现Pandas DataFrame新增最优成绩及对应科目列的方法

问题背景

现有存储班级学生成绩的Pandas DataFrame,包含姓名列及English、French、History等科目成绩列,需新增三列:

  • Best result:学生的最高成绩
  • Best subject 1:第一个取得最高成绩的科目
  • Best subject 2:第二个取得最高成绩的科目(若存在则填充,否则填None)

实现步骤与代码示例

1. 构造示例输入数据

先创建模拟的成绩DataFrame用于测试:

import pandas as pd
import numpy as np

data = {
    '姓名': ['张三', '李四', '王五'],
    'English': [85, 90, 95],
    'French': [90, 90, 95],
    'History': [85, 80, 95]
}
df = pd.DataFrame(data)

2. 计算最优成绩列

动态提取所有科目成绩列(排除姓名列),按行取最大值得到Best result:

# 动态获取所有科目列,无需硬编码科目名
subject_cols = df.columns.drop('姓名')
# 新增最优成绩列
df['Best result'] = df[subject_cols].max(axis=1)

3. 生成最优科目列

提供两种实现方式,分别适配不同规模的数据集:

方式一:apply方法(中小数据集友好,逻辑直观)

通过apply逐行筛选出等于最优成绩的科目,填充到对应列:

def extract_best_subjects(row):
    best_score = row['Best result']
    # 筛选出所有取得最优成绩的科目
    matched_subjects = [col for col in subject_cols if row[col] == best_score]
    # 保证返回两个元素,不足的补None
    return pd.Series(
        matched_subjects + [None]*(2 - len(matched_subjects)),
        index=['Best subject 1', 'Best subject 2']
    )

# 将结果合并到原DataFrame
df = pd.concat([df, df.apply(extract_best_subjects, axis=1)], axis=1)
方式二:矢量化方法(大数据集高效,避免apply开销)

利用Numpy广播和矩阵操作实现,性能更优:

# 将科目成绩转为数组
subject_values = df[subject_cols].values
# 将最优成绩转为列向量,用于广播比较
best_scores = df['Best result'].values[:, np.newaxis]
# 生成布尔矩阵,标记每个位置是否为最优成绩
is_best = subject_values == best_scores

# 获取每个行的最优科目索引,统一格式为每行2个元素
max_best_count = is_best.sum(axis=1).max()
best_indices = np.where(is_best)[1].reshape(-1, max_best_count)[:, :2]

# 转换为科目名称,缺失值填充None
best_subjects_df = pd.DataFrame(
    subject_cols[best_indices],
    columns=['Best subject 1', 'Best subject 2'],
    index=df.index
).fillna(None)

# 合并到原DataFrame
df = pd.concat([df, best_subjects_df], axis=1)

最终效果

处理后的DataFrame如下:

姓名EnglishFrenchHistoryBest resultBest subject 1Best subject 2
张三85908590FrenchNone
李四90908090EnglishFrench
王五95959595EnglishFrench

方法优势

  • 动态适配科目列:无需硬编码科目名称,新增科目后代码无需修改
  • 逻辑覆盖全面:自动处理1个、2个、多个最优科目的场景,不足时自动填充None
  • 性能可选:中小数据集用直观的apply,大数据集用矢量化操作保证效率

内容的提问来源于stack exchange,提问作者cs34

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:24:55