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
相关产品推荐
相关产品推荐

