Python 如何将json数据更改为数据帧?
我需要一个将json数据转换为dataframe的帮助。你能帮我怎么做吗 例如: JSON数据Python 如何将json数据更改为数据帧?,python,json,python-3.x,pandas,json-normalize,Python,Json,Python 3.x,Pandas,Json Normalize,我需要一个将json数据转换为dataframe的帮助。你能帮我怎么做吗 例如: JSON数据 { "user_id": "vmani4", "password": "*****", "api_name": "KOL", "body": { "api_name": "KOL"
{
"user_id": "vmani4",
"password": "*****",
"api_name": "KOL",
"body": {
"api_name": "KOL",
"columns": [
"kol_id",
"jnj_id",
"kol_full_nm",
"thrc_cd"
],
"filter": {
"kol_id": "101152",
"jnj_id": "7124166",
"thrc_nm": "VIR"
}
}
}
理想产出:
user_id password api_name columns filter filter_value
vmani ****** KOL kol_id kol_id 101152
jnj_id jnj_id 7124166
kol_full_nm thrc_nm VIR
thrc_cd
将是data
JSON
- 使用
将json加载到pandas.json\u normalize
中,并删除不需要的列DataFrame
- 使用
,将pandas.DataFrame.explode
列表展开为单独的行“body.columns”
- 为
数据['body']['filter']
- 使用
组合这两个pandas.DataFrame.join
DataFrames
- 无法将所有
映射到所有'filter'
。'body.columns'
不映射到'thrc\u nm'
中的任何内容'body.columns'
和'filter'
作为单独的列添加,按它们在JSON中的顺序排序,并且与'filter\u value'
不关联'body.columns'
将熊猫作为pd导入
#加载json数据
df=pd.json_normalize(data.drop)(列=['body.filter.kol_id','body.filter.jnj_id','body.filter.thrc_nm'])
#炸柱
df=df.explode('body.columns')。重置索引(drop=True)
#加载和清理数据[正文][过滤器]
df_filter=pd.DataFrame.from_dict(data['body']['filter'],orient='index').reset_index().rename(columns={'index':'filter',0:'filter_value'})
#加入数据帧
dfj=df.join(df_过滤器)
#显示器(dfj)
用户id密码api\u name body.api\u name body.columns筛选器\u值
0 vmani4****KOL KOL KOL_id KOL_id 101152
1 vmani4****KOL KOL jnj_id jnj_id 7124166
2 vmani4******KOL KOL KOL KOL_full_nm thrc_nm VIR
3 vmani4****KOL KOL thrc_cd NaN NaN NaN
选项
- 我认为将每个过滤器作为一列比较容易,其值在下面
#将数据加载到数据帧中
df=pd.json\u规范化(数据)
#炸柱
df=df.explode('body.columns')。重置索引(drop=True)
#显示(df)
用户id密码api_name body.api_name body.columns body.filter.kol_id body.filter.jnj_id body.filter.thrc_nm
0 vmani4****KOL KOL KOL KOL_id 101152 7124166病毒
1 vmani4****KOL KOL jnj_id 101152 7124166病毒
2 vmani4****KOL KOL KOL KOL_full_nm 101152 7124166病毒
3 vmani4****KOL KOL thrc_cd 101152 7124166病毒
我不熟悉DataFrame,但我尽了最大努力以正确的方式为您提供所需输出的解决方案
代码
输出
让我简要介绍一下我的代码首先创建了许多列表
和目录
之所以这样做,是因为我在您想要的输出中看到了一些实际上不在代码中的列,如过滤器值
我还循环使用dict项,以生成另一个满足所需输出的dict
毕竟,由于数据帧中列表的长度不相等,所以我使用了concat
和series
import pandas as pd
import json
import numpy as np
json_data = """ {
"user_id": "vmani4",
"password": "*****",
"api_name": "KOL",
"body": {
"api_name": "KOL",
"columns": [
"kol_id",
"jnj_id",
"kol_full_nm",
"thrc_cd"
],
"filter": {
"kol_id": "101152",
"jnj_id": "7124166",
"thrc_nm": "VIR"
}
}
}"""
python_data = json.loads(json_data)
filter = {}
list_for_filter = []
filter_value = {}
list_for_filter_value = []
first_level = {}
for_colums = {}
for x, y in python_data.items():
if type(y) is dict:
for j, k in y.items():
if j == 'columns':
for_colums[j] = k
if type(k) is dict:
for m, n in k.items():
list_for_filter.append(m)
list_for_filter_value.append(n)
break
first_level[x] = [y]
filter['filter'] = list_for_filter
filter_value['filter_value'] = list_for_filter_value
res = {**first_level, **for_colums, **filter, **filter_value}
df = pd.concat([pd.Series(v, name=k) for k, v in res.items()], axis=1)
print(df)
user_id password api_name columns filter filter_value
0 vmani4 ***** KOL kol_id kol_id 101152
1 NaN NaN NaN jnj_id jnj_id 7124166
2 NaN NaN NaN kol_full_nm thrc_nm VIR
3 NaN NaN NaN thrc_cd NaN NaN