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

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:展开字典并重塑表格结构

  1. 用explode()将每个字典拆分为单独行
  2. 用pd.json_normalize()将字典的键转换为列
  3. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:27:48