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

如何用Pandas/Python高效展开DataFrame中的嵌套JSON列?

问题

我已将所需数据存储在一个DataFrame中,其中某列包含如下嵌套字典列表:

[{'date': '2023-02-03T00:00:00', 'groups': [{'periodType': 'm', 
                                              'projections': [{'identifier': 'TD3BALMO', 'period': 'Feb 23', 'value': 54.621, 'validFrom': '2023-02-01', 'validTo': '2023-02-28', 'nextRolloverDate': '2023-02-28', 'archiveDate': '2023-02-03'}, 
                                                              {'identifier': 'TD3CURMON', 'period': 'Feb 23', 'value': 53.855, 'validFrom': '2023-02-01', 'validTo': '2023-02-28', 'nextRolloverDate': '2023-02-28', 'archiveDate': '2023-02-03'}, 
                                                              {'identifier': 'TD3+1_M', 'period': 'Mar 23', 'value': 55.387, 'validFrom': '2023-03-01', 'validTo': '2023-03-31', 'nextRolloverDate': '2023-02-28', 'archiveDate': '2023-02-03'}, 
                                                              {'identifier': 'TD3+2_M', 'period': 'Apr 23', 'value': 55.174, 'validFrom': '2023-04-01', 'validTo': '2023-04-28', 'nextRolloverDate': '2023-02-28', 'archiveDate': '2023-02-03'}, 
                                                              {'identifier': 'TD3+3_M', 'period': 'May 23', 'value': 55.748, 'validFrom': '2023-05-01', 'validTo': '2023-05-31', 'nextRolloverDate': '2023-02-28', 'archiveDate': '2023-02-03'}, 
                                                              {'identifier': 'TD3+4_M', 'period': 'Jun 23', 'value': 55.608, 'validFrom': '2023-06-01', 'validTo': '2023-06-30', 'nextRolloverDate': '2023-02-28', 'archiveDate': '2023-02-03'}, 
                                                              {'identifier': 'TD3+5_M', 'period': 'Jul 23', 'value': 52.548, 'validFrom': '2023-07-01', 'validTo': '2023-07-31', 'nextRolloverDate': '2023-02-28', 'archiveDate': '2023-02-03'}]}, 
                                            {'periodType': 'q', 
                                              'projections': [{'identifier': 'TD3CURQ', 'period': 'Q1 23', 'value': 52.638, 'validFrom': '2023-01-01', 'validTo': '2023-03-31', 'nextRolloverDate': '2023-03-31', 'archiveDate': '2023-02-03'},
                                                              {'identifier': 'TD3+1Q', 'period': 'Q2 23', 'value': 55.51, 'validFrom': '2023-04-01', 'validTo': '2023-06-30', 'nextRolloverDate': '2023-03-31', 'archiveDate': '2023-02-03'}, 
                                                              {'identifier': 'TD3+2Q', 'period': 'Q3 23', 'value': 51.729, 'validFrom': '2023-07-01', 'validTo': '2023-09-29', 'nextRolloverDate': '2023-03-31', 'archiveDate': '2023-02-03'}, 
                                                              {'identifier': 'TD3+3Q', 'period': 'Q4 23', 'value': 62.63, 'validFrom': '2023-10-01', 'validTo': '2023-12-22', 'nextRolloverDate': '2023-03-31', 'archiveDate': '2023-02-03'}]
                                              }
                                            ]
  }]

我希望将其转换为扁平结构的DataFrame,实际仅需要identifier、period、value这三列数据。尝试过json_normalize但没找到高效实现方式,请问最简的转换方式是什么?

解决方案

这里提供两种简洁的实现方式:

方法一:使用json_normalize链式展开

利用json_normalize的record_path参数逐层展开嵌套结构,最后筛选目标列:

import pandas as pd

# 假设原DataFrame名为df,嵌套数据列名为'nested_data'
flattened = pd.json_normalize(df['nested_data'].explode(), 
                              record_path=['groups', 'projections'],
                              meta=[['date']])[['identifier', 'period', 'value']]
  • 先通过explode()将列中的列表拆分为多行
  • record_path=['groups', 'projections']指定要展开的嵌套路径
  • 最后直接筛选出需要的三列即可

方法二:列表推导式快速提取

如果追求极致简洁,用列表推导式直接提取所有目标数据,再转为DataFrame:

# 同样假设原DataFrame为df,列名为'nested_data'
data = [item for sublist in df['nested_data'] 
        for group in sublist['groups'] 
        for item in group['projections']]
flattened = pd.DataFrame(data)[['identifier', 'period', 'value']]

这种方式逻辑直观,代码量少,适合结构固定的嵌套数据提取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:06:26