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

Pandas解析含字典列表的列提取指定键值时遇类型错误求助

提取DataFrame字典列表列指定键值的问题排查与解决

问题描述

我尝试解析DataFrame中名为tags的列,该列存储字典列表,目标是提取每个字典中var1键的值组成列表。

示例数据

tags列的示例值:

[{'var1': 'blue','var2': 123,'var3': 888},{'var1': 'red','var2': 123,'var3': 888},{'var1': 'green','var2': 123,'var3': 888}]

期望输出

['blue', 'red', 'green']

尝试的代码

d = [{f'{k}{i}': v for i, y in enumerate(x, 1) for k, v in y.items() if k == 'var1'} for x in df['tags']]
df = pd.DataFrame(d, index=df.index).sort_index(axis=1)

遇到的错误

TypeError: 'float' object is not iterable

尝试将i和v转为字符串(str(i)、str(v))后,错误依然存在。


问题根源

报错的核心是**df['tags']列中存在非列表的float类型值**(绝大多数情况是NaN)。当循环遍历到这些值时,enumerate(x)会因为x是不可迭代的float类型,直接抛出TypeError——和你转不转字符串没关系,根本问题是迭代对象不对。


解决方法

1. 先清理异常数据

先把tags列中所有不是列表的内容转为空列表,避免迭代报错:

df['tags'] = df['tags'].apply(lambda x: x if isinstance(x, list) else [])

2. 简化提取逻辑

你原来的代码过于绕,直接用列表推导式就能提取目标值:

# 提取每个列表里所有字典的var1值,生成新列
df['var1_list'] = df['tags'].apply(lambda x: [d.get('var1') for d in x])

如果需要把提取出的var1拆分成单独的列(比如var1_1、var1_2这种格式),可以用pd.Series直接展开:

# 展开为多列,缺失位置自动补NaN
var1_cols = df['tags'].apply(lambda x: pd.Series([d.get('var1') for d in x]))
# 重命名列名
var1_cols.columns = [f'var1_{idx+1}' for idx in var1_cols.columns]
# 和原DataFrame合并
df = pd.concat([df, var1_cols], axis=1)

测试验证

用你给出的示例数据测试:

import pandas as pd

# 构造示例数据
data = {'tags': [
    [{'var1': 'blue','var2': 123,'var3': 888},{'var1': 'red','var2': 123,'var3': 888},{'var1': 'green','var2': 123,'var3': 888}],
    # 模拟一个异常值(NaN)
    float('nan')
]}
df = pd.DataFrame(data)

# 清理数据
df['tags'] = df['tags'].apply(lambda x: x if isinstance(x, list) else [])
# 提取var1列表
df['var1_list'] = df['tags'].apply(lambda x: [d.get('var1') for d in x])

print(df['var1_list'].tolist())

输出:

[['blue', 'red', 'green'], []]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:01:28