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

pandas提取列中字典值赋值新列报TypeError如何解决

错误原因

触发这个报错的核心原因有两个:

  1. 你的d列存在np.nan值(第二行),np.nan是float类型,本身不支持下标/键访问。你写的df['d'].str['p'][0][0]['lt']['ls1']属于原生Python式的链式索引,执行过程中会遇到第二行的NaN值,尝试对float类型做下标取值,直接抛出类型错误。
  2. 原写法逻辑本身有缺陷:它不是逐行从每行的字典里提取对应值,而是试图硬取第0行的固定值,只要列内存在非字典/非列表的空值,这种无判断的链式写法就会崩溃。
正确实现方案

首先注意你的测试代码缺了numpy导入,运行前需要补上import numpy as np。
根据填充需求分两种场景处理:

场景1:逐行提取当前行d列内的ls1值填充对应行的n列空值

用pandas内置的.str访问器逐层解析嵌套结构即可,.str访问器会自动将空值保留为NaN,不会触发类型错误:

import pandas as pd
import numpy as np

df = pd.DataFrame({'n': [np.nan, np.nan],
                   'd': [{'status': {'version': '1.0.0'},
                          'p': [{'identifier': {'Id': 5155,
                          'fips': '07',
                          'aId': 5175},
                          'lt': {'ltnum': '14',
                          'ls1': 0.1485537,
                          'ls2': 6471,
                          'ptype': 'NO'}}]}, 
                          np.nan]
                 })

# 逐层拆嵌套:取p键 -> 取列表第一个元素 -> 取lt键 -> 取ls1键
ls1_col = df['d'].str['p'].str[0].str['lt'].str['ls1']
# 逐行填充
df['n'] = df['n'].fillna(ls1_col)

运行后第一行n列会填充为0.1485537,第二行因为d列本身是空值提取不到ls1,n列保持NaN。

场景2:用第一行d列内的固定ls1值填充所有n列空值

先单独把固定值取出来,不要在整个Series上做链式索引,避免碰到空值触发错误:

# 直接从第一行的字典结构里取固定值
fixed_val = df.loc[0, 'd']['p'][0]['lt']['ls1']
df['n'] = df['n'].fillna(fixed_val)

运行后n列两行都会被填充为0.1485537。

注意事项
  • 处理pandas列内存储的嵌套字典/列表时,优先用.str访问器做逐行键/下标访问,不要直接用原生Python的下标语法遍历整个Series,否则遇到空值、类型不符的值很容易报错。
  • 不建议使用inplace=True参数,pandas高版本已经在逐步淘汰多数操作的inplace逻辑,直接将结果赋值给原列兼容性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:00:57