这篇文章经过编辑,以获取实际的 JSON 文件(大文件),而不是我提取的示例代码片段(在这篇文章中有效)。我想知道为什么当我在此数据集上使用 record_path 时会出现密钥错误。
在 results 键下有 2 个嵌套键,分别名为 'active_ingredients' 和 'packaging',当我进行标准化时,我得到
result = pd.json_normalize(data['results'], record_path=["packaging"],meta=['product_ndc'])
预期的列
package_ndc description marketing_start_date sample marketing_end_date product_ndcs
但是当我将 active_ingredients 添加到 record_path 列表时,我收到一个密钥错误。meta 也是如此。当我将其他列(如“brand_name”和“generic_name”)添加到 meta 列表时,我收到一个密钥错误。查看密钥
这不起作用
result = pd.json_normalize(data['results'], record_path=["packaging","active_ingredients"],meta=['product_ndc','brand_name','generic_name'])
感谢您的帮助
这是我用来获取产生关键错误数据的实际代码。
import pandas as pd
import json
import requests, zipfile, io, os
cwd = os.getcwd()
zip_url = 'https://download.open.fda.gov/drug/ndc/drug-ndc-0001-of-0001.json.zip'
r = requests.get(zip_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall(cwd)
with open('drug-ndc-0001-of-0001.json', 'r') as file:
data = json.load(file)
packaging_data = pd.json_normalize(
data['results'],
record_path=["packaging"],
meta=['product_ndc', 'brand_name', 'generic_name']
)
active_ingredients_data = pd.json_normalize(
data['results'],
record_path=["active_ingredients"],
meta=['product_ndc', 'brand_name', 'generic_name']
)
我将它与您的答案配对并遇到了我在发布问题之前遇到的相同问题。
当你指定多个 record_path 条目(如
"packaging"
和"active_ingredients"
)时,pandas 期望第二个record_path
("active_ingredients"
) 存在于第一个 record_path ("packaging"
) 的每个元素中,但在你的数据中,active_ingredients
它不是包装的嵌套属性这样做可以解决这个问题
由此得出
编辑
我更改了命名以反映您在编辑中的更改:第一个脚本分别使用与、及其合并结果相关的 DataFrames 的变量名
packaging_df
、active_ingredients_df
和,而第二个脚本使用、和用于相同目的。区别仅在于命名约定,对功能或逻辑没有影响。输出是相同的,因此如果您仍然遇到问题,它一定来自其他原因,可能是您之前所做的事情。combined_df
packaging
active_ingredients
packaging_data
active_ingredients_data
combined_data
阅读pandas.json_normalize的文档,record_path 采用 str 变量。
因此,您需要为每个记录路径创建两个数据框,然后根据公共字段将它们合并在一起。