如何用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如下:
| 姓名 | English | French | History | Best result | Best subject 1 | Best subject 2 |
|---|---|---|---|---|---|---|
| 张三 | 85 | 90 | 85 | 90 | French | None |
| 李四 | 90 | 90 | 80 | 90 | English | French |
| 王五 | 95 | 95 | 95 | 95 | English | French |
方法优势
- 动态适配科目列:无需硬编码科目名称,新增科目后代码无需修改
- 逻辑覆盖全面:自动处理1个、2个、多个最优科目的场景,不足时自动填充
None - 性能可选:中小数据集用直观的apply,大数据集用矢量化操作保证效率
内容的提问来源于stack exchange,提问作者cs34
相关产品推荐
相关产品推荐

