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

