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
相关产品推荐
相关产品推荐

