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

Pandas循环处理含字典列并拼接子DataFrame出错求助

错误原因分析

你循环里的核心问题是每次拼接都用空的test_df和当前test_df2组合,且没有累加之前的结果:

  • test_df自始至终是空DataFrame,每次执行x = pd.concat([test_df, test_df2]),得到的x只会是当前循环的test_df2数据
  • 下一次循环时,x又被新的test_df2覆盖,最终只保留最后一次循环的结果

另外你的代码还有隐藏问题:解析后重新创建的df列名是key_a,而非dict_values,后续df.dict_values = ...会触发列不存在的报错。

修正后的实现代码

下面是完整的可运行代码,直接实现你要的格式转换:

import pandas as pd
import json

# 模拟你的原始输入数据
df = pd.DataFrame({
    'id': [123, 345],
    'dict_vals': [
        "{'key_a':[{'a':1,'b':8,'c':7},{'a':14,'b':6,'c':8}]}",
        "{'key_a':[{'a':5,'b':82,'c':72},{'a':4,'b':64,'c':81}]}"
    ]
})

# 1. 解析字典并提取key_a对应的字典列表
df['dict_list'] = df['dict_vals'].str.replace("'", '"').apply(json.loads).apply(lambda x: x['key_a'])

# 2. 初始化结果表,保留id列
result_df = df[['id']].copy()

# 3. 遍历每个字典位置,展开后横向拼接
max_len = df['dict_list'].str.len().max()  # 获取最长的字典列表长度
for i in range(max_len):
    # 提取每行第i个字典,展开为a/b/c列
    temp_df = df['dict_list'].apply(lambda x: x[i]).apply(pd.Series)
    # 横向拼接到结果表(axis=1表示按列拼接)
    result_df = pd.concat([result_df, temp_df], axis=1)

print(result_df)

运行后输出的结果格式和你的期望一致:

id   a   b   c   a   b   c
0  123   1   8   7  14   6   8
1  345   5  82  72   4  64  81
关键逻辑说明
  • 先从原始字典中提取key_a对应的字典列表,避免后续处理嵌套结构的麻烦
  • 始终基于result_df做累加拼接,每次循环把新的a/b/c列追加到右侧,而非覆盖之前的结果
  • 用axis=1参数实现横向拼接,保证同一行的多个字典展开后在同一行并排显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:20:35