如何 json_normalize() df 中的特定字段并保留其他列?

Ano*_*ous 4 python json dataframe pandas json-normalize

这是我的简单示例(我的实际数据集中的 json 字段非常嵌套,因此我一次解压一层)。我需要在 json_normalize() 之后保留数据集上的某些列。

https://pandas.pydata.org/docs/reference/api/pandas.json_normalize.html

开始: 开始

预期(Excel 模型): 预期的

实际的: 实际的

import json

d = {'report_id': [100, 101, 102], 'start_date': ["2021-03-12", "2021-04-22", "2021-05-02"], 
     'report_json': ['{"name":"John", "age":30, "disease":"A-Pox"}', '{"name":"Mary", "age":22, "disease":"B-Pox"}', '{"name":"Karen", "age":42, "disease":"C-Pox"}']}

df = pd.DataFrame(data=d)
display(df)

df = pd.json_normalize(df['report_json'].apply(json.loads), max_level=0, meta=['report_id', 'start_date'])
display(df)
Run Code Online (Sandbox Code Playgroud)

查看 json_normalize() 的文档,我认为元参数是我需要保留 report_id 和 start_date 的参数,但它似乎不起作用,因为要保留的预期字段没有出现在最终数据集上。

有人有建议吗?谢谢。

Dat*_*ice 6

当你沿着结构化索引处理一个非常简单的 json 时,你可以标准化你的框架,然后利用它.join沿着你的轴连接。

from ast import literal_eval


df.join(
      pd.json_normalize(df['report_json'].map(literal_eval))
 ).drop('report_json',axis=1)


   report_id  start_date   name  age disease
0        100  2021-03-12   John   30   A-Pox
1        101  2021-04-22   Mary   22   B-Pox
2        102  2021-05-02  Karen   42   C-Pox
Run Code Online (Sandbox Code Playgroud)