Python无法识别字典列表,需将区域数据转换为宽表
解决DataFrame中字典字符串转列的问题
问题分析
你遇到的TypeError: string indices must be integers,核心原因是单元格内容是字符串格式的字典列表,而非真正的Python字典对象,因此无法直接通过字典索引(如item['region'])提取值。
步骤1:将字符串解析为字典列表
使用ast.literal_eval()工具,它能安全地将符合Python语法的字符串转换为对应的数据结构(列表、字典等),比原生eval()更可靠。
示例代码:
import pandas as pd import ast # 模拟你的原始DataFrame df = pd.DataFrame({ 'region_data': [ "[{'region': 'North', 'percentage': 30}, {'region': 'South', 'percentage': 25}]", "[{'region': 'East', 'percentage': 40}, {'region': 'West', 'percentage': 5}]" ] }) # 解析字符串为字典列表 df['region_data'] = df['region_data'].apply(ast.literal_eval)
步骤2:展开字典并重塑表格结构
- 用
explode()将每个字典拆分为单独行 - 用
pd.json_normalize()将字典的键转换为列 - 用
pivot()将region转为列名,percentage作为对应行的值
示例代码:
# 展开字典列表为单行单字典 exploded_df = df.explode('region_data') # 将字典结构展开为列 normalized_df = pd.json_normalize(exploded_df['region_data']) # 绑定原索引,保证透视时对应正确 normalized_df = normalized_df.set_index(exploded_df.index) # 透视得到目标格式,空值填充为0 result_df = normalized_df.pivot(columns='region', values='percentage').fillna(0) print(result_df)
运行后输出:
East North South West 0 0.0 30.0 25.0 0.0 1 40.0 0.0 0.0 5.0
额外处理提示
- 如果字符串格式不规范(比如混用单双引号、存在多余字符),可先通过
str.replace()清洗:df['region_data'] = df['region_data'].str.replace('"', "'") - 若原DataFrame包含其他业务列,透视时可将这些列加入
index参数,保留原有关联数据:result_df = normalized_df.pivot(index='其他列名', columns='region', values='percentage').fillna(0)
内容的提问来源于stack exchange,提问作者Armando
相关产品推荐
相关产品推荐

