pandas提取列中字典值赋值新列报TypeError如何解决
错误原因
触发这个报错的核心原因有两个:
- 你的
d列存在np.nan值(第二行),np.nan是float类型,本身不支持下标/键访问。你写的df['d'].str['p'][0][0]['lt']['ls1']属于原生Python式的链式索引,执行过程中会遇到第二行的NaN值,尝试对float类型做下标取值,直接抛出类型错误。 - 原写法逻辑本身有缺陷:它不是逐行从每行的字典里提取对应值,而是试图硬取第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
相关产品推荐
相关产品推荐

