将 Json 嵌套到数据框 (pandas)
Nested Json in to dataframe (pandas)
我正在导入以下 json。它不是非常广泛,但我只是在这里添加了一小部分用于演示:
{'request': {'Target': 'Offer',
'Format': 'json',
'Service': 'XXXXX',
'Version': '2',
'NetworkToken': 'uu238939871',
'Method': 'findAll',
'fields': ['preview_url',
'sub1',
'sub2',
'sub3',
'sub4',
'sub5',
'sub6',
'sub7',
'sub8',
'sub9',
'sub10',
'sub11',
'sub12'],
'filters': {'status': 'active', 'advertiser_id': '626'}},
'response': {'status': 1,
'httpStatus': 200,
'data': {'231': {'Offer': {'sub1': '231',
'sub2': '626',
'sub3': 'XXXXXXXX',
'sub4': 'XXXXXXX',
'sub5': 'https://play.google.com/store/apps',
'sub6': 'https://XXXXX',
'sub7': '0.39',
'sub8': 'active',
'sub9': 'None',
'sub10': '0',
'sub11': '0',
'sub12': '1',
'sub13': 'XXXXX'}},
'216': {'Offer': {'sub1': '216',
'sub2': '626',
'sub3': 'XXXXXXXX',
'sub4': '682666',
'sub5': 'https://play.google.com/store/appsg',
'sub6': 'https://XXXXXXX',
'sub7': '1.96000',
'sub8': 'active',
'sub9': 'None',
'sub10': '0',
'sub11': '0',
'sub12': '1',
'sub13': 'XXXXX'}}
'errors': [],
'errorMessage': None}}
我m trying to get this into a data frame by using df = pd.json_normalize(data) however the only thing I
m得到的是一个1行400多列的df,不太理想。
我也尝试使用 flatten 但出现错误,它只是说 'Data'
from flatten_json import flatten
dic_flattened = (flatten(d, '.') for d in data['data'])
df = pd.DataFrame(dic_flattened)
最终的数据框应该在一列中包含每个子项,在行中包含字段,例如:
Sub1
Sub2
Sub3
231
626
XXXXXXXX
216
626
XXXXXXXX
如果在构建 DataFrame 之前先重新格式化 Python 中的字典,会更简单。因为你想要 Sub
键,你可以简单地使用列表理解来提取它们:
out = pd.DataFrame([v['Offer'] for v in my_data['response']['data'].values() if isinstance(v, dict)])
输出:
sub1 sub2 sub3 sub4 sub5 sub6 sub7 sub8 sub9 sub10 sub11 sub12 sub13
0 231 626 XXXXXXXX XXXXXXX https://play.google.com/store/apps https://XXXXX 0.39 active None 0 0 1 XXXXX
1 216 626 XXXXXXXX 682666 https://play.google.com/store/appsg https://XXXXXXX 1.96000 active None 0 0 1 XXXXX
我正在导入以下 json。它不是非常广泛,但我只是在这里添加了一小部分用于演示:
{'request': {'Target': 'Offer',
'Format': 'json',
'Service': 'XXXXX',
'Version': '2',
'NetworkToken': 'uu238939871',
'Method': 'findAll',
'fields': ['preview_url',
'sub1',
'sub2',
'sub3',
'sub4',
'sub5',
'sub6',
'sub7',
'sub8',
'sub9',
'sub10',
'sub11',
'sub12'],
'filters': {'status': 'active', 'advertiser_id': '626'}},
'response': {'status': 1,
'httpStatus': 200,
'data': {'231': {'Offer': {'sub1': '231',
'sub2': '626',
'sub3': 'XXXXXXXX',
'sub4': 'XXXXXXX',
'sub5': 'https://play.google.com/store/apps',
'sub6': 'https://XXXXX',
'sub7': '0.39',
'sub8': 'active',
'sub9': 'None',
'sub10': '0',
'sub11': '0',
'sub12': '1',
'sub13': 'XXXXX'}},
'216': {'Offer': {'sub1': '216',
'sub2': '626',
'sub3': 'XXXXXXXX',
'sub4': '682666',
'sub5': 'https://play.google.com/store/appsg',
'sub6': 'https://XXXXXXX',
'sub7': '1.96000',
'sub8': 'active',
'sub9': 'None',
'sub10': '0',
'sub11': '0',
'sub12': '1',
'sub13': 'XXXXX'}}
'errors': [],
'errorMessage': None}}
我m trying to get this into a data frame by using df = pd.json_normalize(data) however the only thing I
m得到的是一个1行400多列的df,不太理想。
我也尝试使用 flatten 但出现错误,它只是说 'Data'
from flatten_json import flatten
dic_flattened = (flatten(d, '.') for d in data['data'])
df = pd.DataFrame(dic_flattened)
最终的数据框应该在一列中包含每个子项,在行中包含字段,例如:
Sub1 | Sub2 | Sub3 |
---|---|---|
231 | 626 | XXXXXXXX |
216 | 626 | XXXXXXXX |
如果在构建 DataFrame 之前先重新格式化 Python 中的字典,会更简单。因为你想要 Sub
键,你可以简单地使用列表理解来提取它们:
out = pd.DataFrame([v['Offer'] for v in my_data['response']['data'].values() if isinstance(v, dict)])
输出:
sub1 sub2 sub3 sub4 sub5 sub6 sub7 sub8 sub9 sub10 sub11 sub12 sub13
0 231 626 XXXXXXXX XXXXXXX https://play.google.com/store/apps https://XXXXX 0.39 active None 0 0 1 XXXXX
1 216 626 XXXXXXXX 682666 https://play.google.com/store/appsg https://XXXXXXX 1.96000 active None 0 0 1 XXXXX