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

Pandas:将列中字典字符串转为字典并展开为多列

解决DataFrame多字典字符串解析与列展开问题

问题背景

现有如下结构的DataFrame:

account_id  result
0   588930      {"symbol": "MSFT", "balance": 0.00...

其中result列的单个单元格是多个字典用逗号分隔的字符串,示例如下:

'{"symbol": "MSFT", "balance": 0.00, "transactionId": 10496491},{"symbol": "AAPL", "balance": 300.12, "transactionId": 10509620},{"symbol": "TSLA", "balance": 40.4, "transactionId": 10632589}'

需求是将result列内容转为字典结构,最终展开为多列:列名为各个symbol(如MSFT、TSLA),对应值为balance数值。

原代码问题

尝试的解析代码:

def string_to_dict(dict_string):
    # Convert to proper json format
    dict_string = dict_string.replace("'", '"').replace('u"', '"')
    return json.loads(dict_string)

df.result = df.result.apply(string_to_dict)

报错:

JSONDecodeError: Extra data: line 1 column 93 (char 92)

原因是json.loads仅能解析单个JSON对象,而当前字符串是多个独立字典用逗号分隔,不属于合法的JSON格式(合法的多对象JSON应为数组,即包裹在[]中)。

解决方案

步骤1:修正字符串格式并解析为字典列表

将逗号分隔的多字典字符串包裹成JSON数组格式,再用json.loads解析:

import json
import pandas as pd

def parse_result(s):
    # 将多字典字符串转为JSON数组格式
    json_str = f"[{s}]"
    # 替换可能存在的单引号为双引号,确保JSON格式合法
    json_str = json_str.replace("'", '"')
    # 解析为字典列表
    return json.loads(json_str)

# 应用解析函数
df['result'] = df['result'].apply(parse_result)

步骤2:转换为symbol-balance键值对

将每个字典列表转换为以symbol为键、balance为值的字典:

def extract_balance(dicts_list):
    return {item['symbol']: item['balance'] for item in dicts_list}

df['balance_dict'] = df['result'].apply(extract_balance)

步骤3:展开为宽表并合并

将balance_dict列展开为多列,合并回原DataFrame:

# 展开字典列为多列
balance_df = pd.json_normalize(df['balance_dict'])
# 合并回原DataFrame,保留account_id
final_df = pd.concat([df[['account_id']], balance_df], axis=1)

完整代码示例

import json
import pandas as pd

# 模拟原始DataFrame
data = {
    'account_id': [588930],
    'result': ['{"symbol": "MSFT", "balance": 0.00, "transactionId": 10496491},{"symbol": "AAPL", "balance": 300.12, "transactionId": 10509620},{"symbol": "TSLA", "balance": 40.4, "transactionId": 10632589}']
}
df = pd.DataFrame(data)

# 解析result列为字典列表
def parse_result(s):
    json_str = f"[{s}]"
    json_str = json_str.replace("'", '"')
    return json.loads(json_str)

df['result'] = df['result'].apply(parse_result)

# 提取symbol和balance的键值对
df['balance_dict'] = df['result'].apply(lambda x: {item['symbol']: item['balance'] for item in x})

# 展开为多列并合并
balance_df = pd.json_normalize(df['balance_dict'])
final_df = pd.concat([df[['account_id']], balance_df], axis=1)

print(final_df)

运行后输出:

account_id  MSFT   AAPL  TSLA
0      588930   0.0  300.12  40.4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:43:17