官網地址:https://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.io.json.json_normalize.html
先看簡單的dict如何轉化df:
只要一行代碼:pd.DataFrame(data)就可以完成
data = {'user_id': '100001',
'user_name': '小明',
'addr': '北京市',
'phone': '130****0000',
'describe': [{'subject': '英語', 'score': 80},
{'subject': '數學', 'score': 90},
{'subject': '語文', 'score': 85}
]
}
pd.DataFrame(data)
image.png
但是當字典結構變得復雜時,出現多層字典嵌套,上面的方法就不是適用了。
報錯信息: Mixing dicts with non-Series may lead to ambiguous ordering羞秤。
data = {'user_id': '100001',
'user_name': '小明',
'info': {
'addr': '北京市',
'phone': '130****0000'
},
'describe': [{'subject': '英語', 'score': 80},
{'subject': '數學', 'score': 90},
{'subject': '語文', 'score': 85}
]
}
image.png
如果傳入的是列表瘾蛋,可以正常解析,但是結果不是我們想要的哺哼。可以看到describe里面的內容沒有擴展成多行棍苹。
data = [{'user_id': '100001',
'user_name': '小明',
'info': {
'addr': '北京市',
'phone': '130****0000'
},
'describe': [{'subject': '英語', 'score': 80},
{'subject': '數學', 'score': 90},
{'subject': '語文', 'score': 85}
]
}
]
pd.DataFrame(data)
image.png
現在我們引入今天要說的包--json_normalize,看怎么解決這個問題茵汰。
from pandas.io.json import json_normalize
data = [{'user_id': '100001',
'user_name': '小明',
'info': {
'addr': '北京市',
'phone': '130****0000'
},
'describe': [{'subject': '英語', 'score': 80},
{'subject': '數學', 'score': 90},
{'subject': '語文', 'score': 85}
]
}
]
df = json_normalize(data,['describe'],['user_id','user_name',['info','addr'],['info','phone']])
df
image.png
只要兩行代碼,問題被完美解決了栏豺。如何生成json_normalize所需參數,可以參考一下代碼巷疼。
agr1=[]
agr2=[]
for key,value in data[0].items():
if isinstance(value, list):
agr1.append(key)
elif isinstance(value, dict):
for j in data[0][key].keys():
l=[]
l.append(key)
l.append(j)
agr2.append(l)
else:
agr2.append(key)
print(agr1,agr2)
image.png
再對df列進行處理即可灵奖。
df.columns = [i.split('.')[1] if len(i.split('.')) > 1 else i for i in df.columns]
df
image.png
列表元素數可以隨意增加不受影響
from pandas.io.json import json_normalize
data = [{'user_id': '100001',
'user_name': '小明',
'info': {
'addr': '北京市',
'phone': '130****0000'
},
'describe': [{'subject': '英語', 'score': 80},
{'subject': '數學', 'score': 90},
{'subject': '語文', 'score': 85}]
},
{'user_id': '100002',
'user_name': '小蘭',
'info': {
'addr': '北京市',
'phone': '130****0001'
},
'describe': [{'subject': '英語', 'score': 100},
{'subject': '數學', 'score': 80},
{'subject': '語文', 'score': 805}
]
},
]
df = json_normalize(data,['describe'],['user_id','user_name',['info','addr'],['info','phone']])
df.columns = [i.split('.')[1] if len(i.split('.')) > 1 else i for i in df.columns]
df
image.png
加油??~