Nhảy tới nội dung

JSON

Cấu trúc đơn giản của file json có dạng như sau:

{
"name": "John Doe",
"age": 30,
"married": true,
"children": ["Anna", "Tom"],
"address": {
"street": "123 Main St",
"city": "New York",
"zip": "10001"
}
}

Cấu trúc JSON dạng mảng

[
{
"id": 1,
"product": "Laptop",
"price": 1500.0
},
{
"id": 2,
"product": "Smartphone",
"price": 800.0
}
]

Đọc file JSON

Pandas hỗ trợ đọc file JSON theo phương thức sau

pd.read_json(path_or_buf=None, orient=None,...)

Trong đó:

  • path_or_buf: là đường dẫn đến file json hoặc Object cho trước

  • orient: Kiểu cấu trúc của json

    • records: Dữ liệu có dạng danh sách các dictionary theo cấu trúc [{column -> value}, ... , {column -> value}]
    • split: Dữ liệu có dạng dictionary theo cấu trúc {index -> [index], columns - [columns], data -> [values]}
    • index: Dữ liệu dạng dictionary theo cấu trúc {"index" -> {"column" -> "value"}}
    • columns: Dữ liệu dạng dictionary theo cấu trúc {column -> {index -> value}}
    • values: danh sách các giá trị
  • Ngoài ra còn các tham số khác nữa như chunksize, nrow, các bạn có thể tham khảo tại pd.read_json()

Cấu trúc Records

Giả sử ta có sample_pokemon.json Lưu mảng JSON như sau. Có thể hiểu là mỗi phần tử của mảng là một dòng trong pandas với key là tên cột và value là giá trị của cột.

[{"name":"Bulbasaur","type":["Grass","Poison"],"height":"0.71 m","weight":"6.9 kg"},
{"name":"Ivysaur","type":["Grass","Poison"],"height":"0.99 m","weight":"13.0 kg"},
{"name":"Venusaur","type":["Grass","Poison"],"height":"2.01 m","weight":"100.0 kg"},
{"name":"Charmander","type":["Fire"],"height":"0.61 m","weight":"8.5 kg"},
{"name":"Charmeleon","type":["Fire"],"height":"1.09 m","weight":"19.0 kg"}]

Ta có thể gọi phương thức pd.read_json() với orient='records'

df = pd.read_json('sample_pokemon.json', orient='records')
df.head()
         name             type  height    weight
0 Bulbasaur [Grass, Poison] 0.71 m 6.9 kg
1 Ivysaur [Grass, Poison] 0.99 m 13.0 kg
2 Venusaur [Grass, Poison] 2.01 m 100.0 kg
3 Charmander [Fire] 0.61 m 8.5 kg
4 Charmeleon [Fire] 1.09 m 19.0 kg

Cấu trúc Split

Cấu trúc split có dạng là 1 Json với các key key là index, columns, data. Trong đó

  • index là mảng các index của các dòng,
  • columns là mảng các cột
  • data là mảng các giá trị.
{"index":   [0,1,2,3,4],
"columns": ["name","type","height","weight"],
"data": [["Bulbasaur",["Grass","Poison"],"0.71 m","6.9 kg"],
["Ivysaur",["Grass","Poison"],"0.99 m","13.0 kg"],
["Venusaur",["Grass","Poison"],"2.01 m","100.0 kg"],
["Charmander",["Fire"],"0.61 m","8.5 kg"],
["Charmeleon",["Fire"],"1.09 m","19.0 kg"]]}

Ta có thể gọi phương thức pd.read_json() với orient='split'

df = pd.read_json('sample_pokemon.json', orient='split')
df.head()
         name             type  height    weight
0 Bulbasaur [Grass, Poison] 0.71 m 6.9 kg
1 Ivysaur [Grass, Poison] 0.99 m 13.0 kg
2 Venusaur [Grass, Poison] 2.01 m 100.0 kg
3 Charmander [Fire] 0.61 m 8.5 kg
4 Charmeleon [Fire] 1.09 m 19.0 kg

Cấu trúc Index

Đối với cấu trúc Index, ta có dạng JSON như sau. Cấu trúc này gần tương tự với cấu trúc Records nhưng các key là index của dòng.

{"0":{"name":"Bulbasaur","type":["Grass","Poison"],"height":"0.71 m","weight":"6.9 kg"},
"1":{"name":"Ivysaur","type":["Grass","Poison"],"height":"0.99 m","weight":"13.0 kg"},
"2":{"name":"Venusaur","type":["Grass","Poison"],"height":"2.01 m","weight":"100.0 kg"},
"3":{"name":"Charmander","type":["Fire"],"height":"0.61 m","weight":"8.5 kg"},
"4":{"name":"Charmeleon","type":["Fire"],"height":"1.09 m","weight":"19.0 kg"}}

Ta có thể gọi phương thức pd.read_json() với orient='index'

df = pd.read_json('sample_pokemon.json', orient='index')
df.head()

Cấu trúc Columns

Cấu trúc Columns có dạng JSON như sau. Cấu trúc này có key là cột, Value là một dictionary với các key là index của dòng, value là giá trị của dòng.

{"name":{"0":"Bulbasaur",
"1":"Ivysaur",
"2":"Venusaur",
"3":"Charmander"
"4":"Charmeleon"},
"type":{"0":["Grass","Poison"],
"1":["Grass","Poison"],
"2":["Grass","Poison"],
"3":["Fire"],
"4":["Fire"]},
"height":{"0":"0.71 m",
"1":"0.99 m",
"2":"2.01 m",
"3":"0.61 m",
"4":"1.09 m"},
"weight":{"0":"6.9 kg",
"1":"13.0 kg",
"2":"100.0 kg",
"3":"8.5 kg",
"4":"19.0 kg"}}

Ta có thể gọi phương thức pd.read_json() với orient='columns'

df = pd.read_json('sample_pokemon.json', orient='columns')
df.head()

Cấu trúc Values

[["Bulbasaur",["Grass","Poison"],"0.71 m","6.9 kg"],
["Ivysaur",["Grass","Poison"],"0.99 m","13.0 kg"],
["Venusaur",["Grass","Poison"],"2.01 m","100.0 kg"],
["Charmander",["Fire"],"0.61 m","8.5 kg"],
["Charmeleon",["Fire"],"1.09 m","19.0 kg"]]
Lưu ý
  • pd.read_json() mặc định orient='records'. Các cấu trúc recordsindex là các cấu trúc JSON thường gặp.

  • values không phải cấu trúc JSON.

  • có thể truyền link file thay vì file được lưu ở máy.

Xuất file JSON