I have a real-time url “linktoAPI” containing a list of nested dictionary. I have tried many solutions from the links below, but none of them helps me achieve what I want. Apparently, it is because the value of the nested dictionary (key: “history_value”) is ununiform and contain long string object.
Extract dictionary value from column in data frame (got the error: ‘get’ does not applicable for string)
How to convert list of nested dictionary to pandas DataFrame? (got the error:’str’ object is not a mapping)
Split / Explode a column of dictionaries into separate columns with pandas,
https://www.skytowner.com/explore/splitting_dictionary_into_separate_columns_in_pandas_dataframe
from urllib.request import urlopen import pandas as pd import json url = "LINKTOAPI" response = urlopen(url) data_json = json.loads(response.read()) baoluu = pd.DataFrame(data_json) display(baoluu.head())
Run this code and you can see that the column “history_value” contain an ununiform dictionary. I want this columns to be separated into “ngaybaoluu”, “ngayhoclai” and “lydo”. Please help me. Thank you very much!!!
Advertisement
Answer
If I get it right, this should work:
import json import requests import pandas as pd req = requests.get('https://office.ieltsvietop.vn/api/get_data/history') req_json = req.json() df = pd.DataFrame(json.loads(r['history_value']) for r in req_json)
this df
should be like
request_id ketoan_id lop_id ... danhsachcho chinhanh_old chinhanh 0 11 2470 551 ... NaN NaN NaN 1 13 2474 551 ... NaN NaN NaN 2 12 2468 564 ... NaN NaN NaN 3 15 2338 442 ... NaN NaN NaN 4 31 2463 239 ... NaN NaN NaN ... ... ... ... ... ... ... ... 5256 4699 4357 NaN ... NaN NaN NaN 5257 4695 3787 NaN ... NaN NaN NaN 5258 4679 4716 NaN ... NaN NaN NaN 5259 4694 4114 596 ... NaN NaN NaN 5260 4705 4839 601 ... NaN NaN NaN [5261 rows x 20 columns]
then we select the needed columns ngaybaoluu
, ngayhoclai
and lydo
with
df = df[['ngaybaoluu', 'ngayhoclai', 'lydo']]
the final df
is
ngaybaoluu ngayhoclai lydo 0 NaN NaN Bạn phù hợp với trình độ của lớp 1 NaN NaN Bạn cần lấy target để ra trường và phục vụ côn... 2 NaN NaN Học viên đăng kí học Speaking-express 3 NaN NaN Vt3 có lớp phù hợp với trình độ của bạn 4 NaN NaN NaN ... ... ... ... 5256 22-06-2022 01-08-2022 Học viên tập trung ôn thi THPTQG. Học viên đã ... 5257 21-06-2022 21-08-2022 Học viên chưa sắp xếp được lịch học lại . Học ... 5258 21-06-2022 15-07-2022 Học viên đi tập quân sự. Học viên đã hiểu rõ ... 5259 NaN 22-06-2022 NaN 5260 NaN NaN NaN [5261 rows x 3 columns]
Be aware that many of the columns have null values in them, which means the original response of the url does not contain these fields, so it’s fine. If you want to fill these null values, you can look up to .fillna()
.