如何用Pandas将DataFrame中嵌套Map类型列拆分为多列?
解决嵌套JSON字符串列展开为结构化DataFrame的问题
问题原因
你的Data列存储的是JSON格式的字符串,而非Python原生字典。直接将这类字符串传入pd.json_normalize无法被解析,因此返回空DataFrame。另外explode方法仅适用于展开列表类型的单元格,对嵌套JSON结构无效。
解决方案
需要先将JSON字符串转换为Python字典,再进行结构化展开,步骤如下:
- 转换JSON字符串为字典:使用
json.loads解析每一行的Data列内容 - 展开嵌套JSON:用
pd.json_normalize处理转换后的字典列表 - 合并ID列与结果:将原DataFrame的
ID列和展开后的结构化数据拼接 - 调整列名格式:将默认的点分隔列名替换为下划线,匹配目标结构
完整代码示例
import json import pandas as pd # 处理JSON字符串转字典 df_test['Data'] = df_test['Data'].apply(json.loads) # 展开嵌套JSON结构 expanded_data = pd.json_normalize(df_test['Data']) # 合并ID列与展开数据 final_df = pd.concat([df_test['ID'], expanded_data], axis=1) # 替换列名中的点为下划线,匹配目标格式 final_df.columns = final_df.columns.str.replace('.', '_') # 查看结果 print(final_df)
执行后即可得到你期望的结构化DataFrame:
| ID | B_1__seconds | B_1__nanoseconds | C_1__seconds | C_1__nanoseconds | D_1__seconds | D_1__nanoseconds |
|---|---|---|---|---|---|---|
| test-001 | 1663207410 | 466000000 | 1663207409 | 978000000 | 1663207417 | 231000000 |
| test-002 | 1663202431 | 134000000 | 1663208245 | 412000000 | 1663203482 | 682000000 |
注:如果需要去掉列名中多余的下划线(比如
_seconds前的两个下划线),可以用str.replace('__', '_')进一步处理。
内容的提问来源于stack exchange,提问作者Evantaka
相关产品推荐
相关产品推荐

