如何用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
相关产品推荐
相关产品推荐

