如何展平嵌套JSON中openfda的列表值至Pandas DataFrame?
展平DataFrame中openfda字段的列表值
假设你的JSON数据结构类似这样(openfda下的字段以列表形式存储):
[ { "id": "123", "product_name": "Sample Drug", "openfda": { "brand_name": ["Brand X"], "generic_name": ["Generic X"], "manufacturer_name": ["ABC Pharma"] } } ]
如果你的现有代码已经用pd.json_normalize完成了初步展平,但openfda相关列仍为列表格式,可以通过以下方法直接处理这些列:
方法1:遍历处理openfda列
在初始展平后,遍历所有以openfda.开头的列,将列表转换为单个值(或拼接多元素):
import pandas as pd import json # 加载JSON数据 with open('your_data.json', 'r') as f: data = json.load(f) # 初步展平 df = pd.json_normalize(data) # 处理openfda的列表字段 for col in df.columns: if col.startswith('openfda.'): # 情况1:每个列表只有一个元素,取第一个值 df[col] = df[col].apply(lambda x: x[0] if isinstance(x, list) and len(x) > 0 else None) # 情况2:列表有多个元素,用逗号拼接成字符串(按需选择) # df[col] = df[col].apply(lambda x: ', '.join(x) if isinstance(x, list) and len(x) > 0 else None) print(df)
方法2:展平前先处理openfda字典
如果你的初始DataFrame中openfda是一个未展开的字典列,可以先单独展开openfda并处理列表,再合并回原DataFrame:
import pandas as pd import json with open('your_data.json', 'r') as f: data = json.load(f) df = pd.json_normalize(data) # 单独展开openfda字典 openfda_df = pd.json_normalize(df['openfda']) # 处理openfdf中的列表字段 for col in openfda_df.columns: openfda_df[col] = openfda_df[col].apply(lambda x: x[0] if isinstance(x, list) and x else None) # 合并回原DataFrame,添加前缀区分 df = pd.concat([df.drop('openfda', axis=1), openfda_df.add_prefix('openfda.')], axis=1)
关键说明
- 如果列表为空,上述代码会将其转为
None,避免空列表残留; - 根据业务需求选择取第一个元素还是拼接多元素,调整lambda函数即可;
- 确保
pd.json_normalize已正确加载数据,若JSON是嵌套数组结构,需确认record_path参数是否正确(如果初始展平有问题的话)。
内容的提问来源于stack exchange,提问作者Nano
相关产品推荐
相关产品推荐

