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

Pandas:如何基于条件语句生成对应成绩列数据

解决Pandas中根据分数批量生成对应等级的问题

方法一:矢量化操作(推荐,高效)

Pandas原生适合用矢量化操作处理批量数据转换,比循环效率更高。可以用np.select实现多条件的等级映射:

代码实现

import pandas as pd
import numpy as np

# 原始平均分数DataFrame
avg_df = pd.DataFrame.from_records(
    [
        {"Student": "Samantha", "AVG WK A": 104, "AVG WK B": 114},
        {"Student": "Billy", "AVG WK A": 70, "AVG WK B": 92},
    ],
)

# 初始化成绩DataFrame,保留学生姓名列
grade_df = avg_df[["Student"]].copy()

# 遍历所有分数列,生成对应等级列
for col in avg_df.columns:
    if col == "Student":
        continue
    # 获取当前列的分数数据
    scores = avg_df[col]
    # 定义条件与对应等级
    conditions = [
        scores >= 110,
        (scores > 91) & (scores < 110),
        scores <= 91
    ]
    grades = ["A+", "A", "C-"]
    # 映射等级并添加到成绩DataFrame
    grade_col_name = col.replace("AVG WK ", "Week ")
    grade_df[grade_col_name] = np.select(conditions, grades, default="C-")

print(grade_df)

输出结果

+----+-----------+----------+----------+
|    | Student   | Week A   | Week B   |
|----+-----------+----------+----------|
|  0 | Samantha  | A        | A+       |
|  1 | Billy     | C-       | A        |
+----+-----------+----------+----------+

方法二:行列循环处理(符合你的需求)

如果需要显式遍历每行每列赋值,可按以下方式实现:

代码实现

import pandas as pd

# 原始平均分数DataFrame
avg_df = pd.DataFrame.from_records(
    [
        {"Student": "Samantha", "AVG WK A": 104, "AVG WK B": 114},
        {"Student": "Billy", "AVG WK A": 70, "AVG WK B": 92},
    ],
)

# 创建空的成绩DataFrame
grade_df = pd.DataFrame({
    "Student": avg_df["Student"],
    "Week A": "",
    "Week B": ""
})

# 遍历每行学生数据
for idx in range(len(avg_df)):
    # 处理Week A成绩
    score_a = avg_df.loc[idx, "AVG WK A"]
    if score_a >= 110:
        grade_df.loc[idx, "Week A"] = "A+"
    elif 91 < score_a < 110:
        grade_df.loc[idx, "Week A"] = "A"
    else:
        grade_df.loc[idx, "Week A"] = "C-"
    
    # 处理Week B成绩
    score_b = avg_df.loc[idx, "AVG WK B"]
    if score_b >= 110:
        grade_df.loc[idx, "Week B"] = "A+"
    elif 91 < score_b < 110:
        grade_df.loc[idx, "Week B"] = "A"
    else:
        grade_df.loc[idx, "Week B"] = "C-"

print(grade_df)

错误原因说明

你之前用df.loc[len(df)]导致所有列成绩相同,是因为错误地给整列赋值(比如grade_df["Week A"] = "A"),而非定位到具体行和列。正确做法是用grade_df.loc[idx, "列名"]精准指定单元格赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:47:42