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

如何展平嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:32:32