如何在Python中将嵌套字典转换为指定格式的DataFrame
解决方案
步骤说明与代码实现
我们可以通过Pandas的多层索引、数据展开和列重命名来实现需求,具体代码如下:
import pandas as pd # 假设你的原始嵌套字典名为 student_data student_data = { 'Student_ID_1': {'Course_1': [12,45,378], 'Course_2': [33,78,345]}, 'Student_ID_2': {'Course_6': [15,25,48], 'Course_24': [31,38,342]} } # 1. 将嵌套字典转为多层索引Series,每层索引对应学生ID和课程ID s = pd.Series(student_data).stack() # 2. 把每个课程对应的列表拆分为3列(对应a/b/c三个值) df = s.apply(pd.Series) # 3. 给拆分后的列加上后缀,并和课程ID组合成最终列名 df.columns = ['_a', '_b', '_c'] df = df.unstack(level='Course_ID') df.columns = [f'{course_col}{suffix}' for suffix, course_col in df.columns] # 4. 把学生ID从索引转为列,并重置索引 df = df.reset_index().rename(columns={'index': 'Student_ID'}) # 5. 补全所有50门课程的a/b/c列,缺失值填充NaN(可改为fillna(0)填充0) all_required_cols = [] for course_num in range(1, 51): all_required_cols += [f'Course_{course_num}_a', f'Course_{course_num}_b', f'Course_{course_num}_c'] df = df.reindex(columns=['Student_ID'] + all_required_cols) # 可选:如果需要把Student_ID转为纯数字(比如从'Student_ID_12855'提取12855) df['Student_ID'] = df['Student_ID'].str.extract(r'(\d+)').astype(int) print(df.head())
关键步骤解释
- 多层索引展开:
stack()把每个学生的课程从字典键转为二级索引,让每个(学生ID,课程ID)对对应一个数值列表。 - 列表拆分:
apply(pd.Series)自动把列表的三个元素拆分为三列,解决了你之前只能取第一个值的问题。 - 列名重构:通过
unstack和字符串拼接,把课程ID和a/b/c后缀组合成需求中的列名格式。 - 补全列:
reindex确保所有50门课程的三个列都存在,避免部分学生未修课程导致列缺失的问题。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

