如何用Python将含学生ID列表的DataFrame拆分为多行状态记录?
Python实现DataFrame格式转换
问题描述
现有如下结构的DataFrame:
| ID | Pass | Fail | Pass_student_ID | Failed_student_ID |
|---|---|---|---|---|
| 1 | 2 | 0 | [101,102] | 0 |
| 2 | 1 | 1 | [102] | 101 |
| 3 | 0 | 1 | [101,102] | 0 |
需要转换为以下格式的DataFrame:
| ID | Student_ID | Status |
|---|---|---|
| 1 | 101 | Pass |
| 1 | 102 | Pass |
| 2 | 101 | Fail |
| 2 | 102 | Pass |
| 3 | 101 | Fail |
| 3 | 102 | Fail |
解决方案
可以通过拆分并分别处理「通过」和「不及格」的学生数据,再合并结果来实现转换,具体代码如下:
首先导入依赖库并构造原始数据:
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
相关产品推荐
相关产品推荐

