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

Pandas处理含列表与字典列的DataFrame遇Series错误及格式转换问题

Pandas嵌套数据扁平化解决方案

一、关于扁平化思路的合理性

扁平化后学生列重复是完全合理的,这是将嵌套的列表-字典结构转换为关系型明细数据的标准方式:

  • 这种结构是后续做科目统计、学生成绩分析的基础,比如分组求平均分、科目最高分等操作,都依赖每行对应一个「学生-科目-分数」的明细行。
  • Pandas对重复值的存储有内部优化,不会额外占用过多内存,无需担心性能问题。如果需要聚合结果,后续用groupby即可快速得到汇总数据。

二、代码报错与NaN问题的解决方案

你遇到的ValueError和大量NaN,核心原因是没有先将列表拆分为单行,直接对列表列使用apply(pd.Series)导致的。正确步骤如下:

1. 模拟你的原始数据场景

import pandas as pd
df = pd.DataFrame({
    '学生姓名': ['张三', '李四'],
    '考试成绩': [
        [{'科目': '数学', '分数': 90}, {'科目': '语文', '分数': 85}],
        [{'科目': '数学', '分数': 88}, {'科目': '英语', '分数': 92}]
    ]
})

2. 两步完成扁平化

步骤1:拆分列表为单行

用explode将每个字典从列表中拆出,对应单独一行,学生姓名自动重复:

df_exploded = df.explode('考试成绩', ignore_index=True)

步骤2:将字典列转为多列

此时考试成绩列的每个元素是单个字典,用以下两种方式均可转换为列:

# 方法1:apply(pd.Series)
df_flat = pd.concat([
    df_exploded.drop('考试成绩', axis=1),
    df_exploded['考试成绩'].apply(pd.Series)
], axis=1)

# 方法2:pd.json_normalize(更稳定,适合复杂嵌套字典)
df_flat = pd.json_normalize(df_exploded.to_dict('records'))

3. 最终扁平化结果

执行后得到符合需求的格式:

学生姓名  科目  分数
0   张三  数学  90
1   张三  语文  85
2   李四  数学  88
3   李四  英语  92

报错原因说明

之前直接对列表列用apply(pd.Series),会把每个列表转为多列,不同行的列表长度不同就会生成大量NaN;同时后续操作中Pandas无法判断Series的真值,触发"The truth value of a Series is ambiguous..."错误。先通过explode拆分列表后,每个元素是单个字典,就能避免这类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:57:10