Skip to content
Advertisement

Convert a list of nested dictionary WITH STRING OBJECT into pandas Dataframe

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().

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement