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

如何用Python将含学生ID列表的DataFrame拆分为多行状态记录?

Python实现DataFrame格式转换

问题描述

现有如下结构的DataFrame:

IDPassFailPass_student_IDFailed_student_ID
120[101,102]0
211[102]101
301[101,102]0

需要转换为以下格式的DataFrame:

IDStudent_IDStatus
1101Pass
1102Pass
2101Fail
2102Pass
3101Fail
3102Fail

解决方案

可以通过拆分并分别处理「通过」和「不及格」的学生数据,再合并结果来实现转换,具体代码如下:

首先导入依赖库并构造原始数据:

import pandas as pd

# 构造原始DataFrame
df = pd.DataFrame({
    'ID': [1, 2, 3],
    'Pass': [2, 1, 0],
    'Fail': [0, 1, 1],
    'Pass_student_ID': [[101,102], [102], [101,102]],
    'Failed_student_ID': [0, 101, 0]
})

步骤1:处理通过的学生数据

展开Pass_student_ID列的列表数据,过滤掉无效的0值,标记状态为Pass:

pass_data = df.explode('Pass_student_ID')
pass_data = pass_data[pass_data['Pass_student_ID'] != 0]
pass_data['Status'] = 'Pass'
pass_data = pass_data[['ID', 'Pass_student_ID', 'Status']].rename(columns={'Pass_student_ID': 'Student_ID'})

步骤2:处理不及格的学生数据

先将单个值的Failed_student_ID转为列表(统一格式),过滤0值后展开,标记状态为Fail:

# 把单个值转为列表,方便后续统一展开处理
df['Failed_student_ID'] = df['Failed_student_ID'].apply(lambda x: [x] if x != 0 else [])
fail_data = df.explode('Failed_student_ID')
fail_data['Status'] = 'Fail'
fail_data = fail_data[['ID', 'Failed_student_ID', 'Status']].rename(columns={'Failed_student_ID': 'Student_ID'})

步骤3:合并并整理结果

将两部分数据合并,按ID和Student_ID排序后重置索引:

final_df = pd.concat([pass_data, fail_data]).sort_values(by=['ID', 'Student_ID']).reset_index(drop=True)

运行以上代码后,final_df就是你需要的目标格式DataFrame。

内容的提问来源于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 12:25:33