如何将含array值的字符串字典列表转换为Pandas DataFrame?
解决字符串字典列表转Pandas DataFrame的问题
问题核心
你的列表元素是带引号的字符串格式字典,且字典值是array([x])格式,直接转换会生成单列数据,用ast.literal_eval或eval时会因array未定义报错。
解决方案
方法1:正则替换提取数值(推荐,更安全)
先把字符串里的array([x])替换成纯数值,再转成字典,最后生成DataFrame:
import re import ast import pandas as pd # 示例输入列表 str_dicts = [ "{'A': array([1]), 'B': array([2]), 'C': array([3])}", "{'A': array([4]), 'B': array([5]), 'C': array([6])}", "{'A': array([7]), 'B': array([8]), 'C': array([9])}" ] def parse_str_dict(s): # 替换array([x])为x的数值部分 cleaned_str = re.sub(r'array\(\[(\d+)\]\)', r'\1', s) # 转换为Python字典 return ast.literal_eval(cleaned_str) # 批量处理所有字符串字典 dict_list = [parse_str_dict(s) for s in str_dicts] # 生成DataFrame df = pd.DataFrame(dict_list) print(df)
输出结果:
A B C 0 1 2 3 1 4 5 6 2 7 8 9
方法2:在eval中引入numpy.array(保留数组结构可选)
如果需要保留numpy数组类型(或值不是单元素数组),可以在eval时传入包含array的命名空间:
import numpy as np import pandas as pd str_dicts = [ "{'A': array([1]), 'B': array([2]), 'C': array([3])}", "{'A': array([4]), 'B': array([5]), 'C': array([6])}", "{'A': array([7]), 'B': array([8]), 'C': array([9])}" ] # 用eval时指定globals,把numpy.array传入 dict_list = [eval(s, {'array': np.array}) for s in str_dicts] df = pd.DataFrame(dict_list) # 若需将单元素数组转为普通数值,执行以下步骤 df = df.applymap(lambda x: x.item() if isinstance(x, np.ndarray) else x) print(df)
关键说明
- 直接转单列的原因:
pd.DataFrame(str_dicts)会把每个字符串当作单个元素,必须先将每个字符串解析为字典,再用字典列表生成DataFrame。 NameError的原因:eval和ast.literal_eval默认命名空间中没有array这个名称,要么替换掉字符串中的array写法,要么显式引入np.array到命名空间。
内容的提问来源于stack exchange,提问作者salamander
相关产品推荐
相关产品推荐

