您可以使用json_normalize(),它非常有效。
这篇文章很好的解释了不同的场景:
https://towardsdatascience.com/all-pandas-json-normalize-you-should-know-for-flattening-json-13eae1dfb7dd
这里有一些例子。
some_dict = {
'key1': 'value1',
'key2': 'value2',
'key3': 123,
}
df = pd.json_normalize(some_dict)
对于多个级别,如果您不想要所有级别,您可以使用:
pd.json_normalize(data, max_level=1)
使用嵌套列表,您可以使用meta 指定要包含的列表:
json_object = {
'key1': 'value1',
'key2': 'value2',
'key3': {
'key3_1': 'value3',
'key3_2': {
'key3_2_1': {
'admission': 'value4',
'general': 'value5'
},
'key3_3': 'value6',
}
},
'key4': [
{ 'key4_1': 'value7' },
{ 'key4_2': 'value8' },
{ 'key4_3': 'value9' }
],
}
# you can do:
pd.json_normalize(
json_object,
record_path =['key4'],
meta=['key1', ['key3', 'key3_2', 'key3_3']],
)
如果您的列表并非始终存在所有键,则可以使用errors='ignore'。
pd.json_normalize(
json_object,
record_path =['key4'],
meta=['key1', ['key3', 'key3_2', 'key3_3']],
errors='ignore'
)
默认情况下,嵌套值将用. 分隔,您可以使用sep='' 进行更改:
pd.json_normalize(
json_object,
record_path =['key4'],
meta=['key1', ['key3', 'key3_2', 'key3_3']],
errors='ignore',
sep='-'
)
这取决于您从本地文件或 URL 获取 JSON 数据的位置。
对于本地文件:
import json
# load data using Python JSON module
with open('data/simple.json','r') as f:
data = json.loads(f.read())
# Flattening JSON data
pd.json_normalize(data)
对于网址:
import requestsURL = 'http://raw.githubusercontent.com/BindiChen/machine-learning/master/data-analysis/027-pandas-convert-json/data/simple.json'
data = json.loads(requests.get(URL).text)# Flattening JSON data
pd.json_normalize(data)