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

如何用Python实现按科目与SID统计成绩并生成目标DataFrame?

解决方案

你可以通过pandas的去重、分组和自定义聚合逻辑来实现需求,以下是具体代码和步骤:

1. 导入库并构造示例数据

import pandas as pd

# 原始数据
raw_data = {
    '学生ID': [101, 101, 101, 101, 101, 101, 102, 102, 102, 102],
    '科目': ['English', 'English', 'Mathematics', 'Mathematics', 'Mathematics', 'Mathematics', 'English', 'English', 'Mathematics', 'Mathematics'],
    'SID': [1, 1, 3, 3, 33, 33, 1, 1, 3, 3],
    '成绩': ['Pass', 'Pass', 'Pass', 'Pass', 'Fail', 'Fail', 'Pass', 'Pass', 'Fail', 'Fail']
}
df = pd.DataFrame(raw_data)

2. 去重处理(关键)

原始数据中同一学生的同一科目+SID组合存在重复行,先按这三列去重,确保每个学生在同一组内只被统计一次:

df_unique = df.drop_duplicates(subset=['学生ID', '科目', 'SID'])

3. 分组聚合计算目标指标

定义分组处理函数,统计及格/不及格人数并收集不及格学生ID:

def process_group(group):
    pass_count = (group['成绩'] == 'Pass').sum()
    fail_count = (group['成绩'] == 'Fail').sum()
    # 多个不及格学生ID用逗号分隔,无则留空
    failed_ids = ','.join(map(str, group[group['成绩'] == 'Fail']['学生ID'])) if fail_count > 0 else ''
    return pd.Series([pass_count, fail_count, failed_ids], index=['Pass', 'Fail', 'Failed_student_ID'])

# 按科目和SID分组,应用处理函数
result_df = df_unique.groupby(['科目', 'SID']).apply(process_group).reset_index()

最终结果

运行后result_df即为目标结构的DataFrame:

科目  SID  Pass  Fail Failed_student_ID
0    English    1     2     0                 
1  Mathematics    3     1     1              102
2  Mathematics   33     0     1              101

注意事项

  • 去重步骤不可省略:如果跳过,统计的是重复行数而非实际学生数,会导致结果错误。
  • 自定义聚合函数适用于大型数据集:逻辑清晰且效率稳定,若有多个不及格学生,会自动用逗号拼接ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:55:24