JSON(<b>J</b>ava<b>S</b>cript <b>O</b>bject <b>N</b>otation,JavaScript 對象表示法),是存儲和交換文本資訊的文法,類似 XML。
JSON 比 XML 更小、更快,更易解析,更多 JSON 内容可以參考 JSON 教程。
Pandas 可以很友善的處理 JSON 資料,本文以 sites.json 為例,内容如下:
[
{
"id": "A001",
"name": "菜鳥教程",
"url": "www.runoob.com",
"likes": 61
},
"id": "A002",
"name": "Google",
"url": "www.google.com",
"likes": 124
"id": "A003",
"name": "淘寶",
"url": "www.taobao.com",
"likes": 45
}
]
import pandas as pd
df = pd.read_json('sites.json')
print(df.to_string())
to_string() 用于傳回 DataFrame 類型的資料,我們也可以直接處理 JSON 字元串。
data =[
{
"id": "A001",
"name": "菜鳥教程",
"url": "www.runoob.com",
"likes": 61
},
"id": "A002",
"name": "Google",
"url": "www.google.com",
"likes": 124
"id": "A003",
"name": "淘寶",
"url": "www.taobao.com",
"likes": 45
}
df = pd.DataFrame(data)
print(df)
以上執行個體輸出結果為:
JSON 對象與 Python 字典具有相同的格式,是以我們可以直接将 Python 字典轉化為 DataFrame 資料:
# 字典格式的 JSON
s = {
"col1":{"row1":1,"row2":2,"row3":3},
"col2":{"row1":"x","row2":"y","row3":"z"}
# 讀取 JSON 轉為 DataFrame
df = pd.DataFrame(s)
從 URL 中讀取 JSON 資料:
URL = 'https://static.runoob.com/download/sites.json'
df = pd.read_json(URL)
假設有一組内嵌的 JSON 資料檔案 nested_list.json :
"school_name": "ABC primary school",
"class": "Year 1",
"students": [
"id": "A001",
"name": "Tom",
"math": 60,
"physics": 66,
"chemistry": 61
"id": "A002",
"name": "James",
"math": 89,
"physics": 76,
"chemistry": 51
"id": "A003",
"name": "Jenny",
"math": 79,
"physics": 90,
"chemistry": 78
}]
使用以下代碼格式化完整内容:
df = pd.read_json('nested_list.json')
這時我們就需要使用到 json_normalize() 方法将内嵌的資料完整的解析出來:
import json
# 使用 Python JSON 子產品載入資料
with open('nested_list.json','r') as f:
data = json.loads(f.read())
# 展平資料
df_nested_list = pd.json_normalize(data, record_path =['students'])
print(df_nested_list)
data = json.loads(f.read()) 使用 Python JSON 子產品載入資料。
json_normalize() 使用了參數 record_path 并設定為 ['students'] 用于展開内嵌的 JSON 資料 students。
顯示結果還沒有包含 school_name 和 class 元素,如果需要展示出來可以使用 meta 參數來顯示這些中繼資料:
df_nested_list = pd.json_normalize(
data,
record_path =['students'],
meta=['school_name', 'class']
)
接下來,讓我們嘗試讀取更複雜的 JSON 資料,該資料嵌套了清單和字典,資料檔案 nested_mix.json 如下:
"school_name": "local primary school",
"info": {
"president": "John Kasich",
"address": "ABC road, London, UK",
"contacts": {
"email": "[email protected]",
"tel": "123456789"
}
nested_mix.json 檔案轉換為 DataFrame:
with open('nested_mix.json','r') as f:
df = pd.json_normalize(
meta=[
'class',
['info', 'president'],
['info', 'contacts', 'tel']
]
以下是執行個體檔案 nested_deep.json,我們隻讀取内嵌中的 math 字段:
"grade": {
"math": 60,
"physics": 66,
"chemistry": 61
}
"math": 89,
"physics": 76,
"chemistry": 51
"math": 79,
"physics": 90,
"chemistry": 78
這裡我們需要使用到 glom 子產品來處理資料套嵌,glom 子產品允許我們使用 . 來通路内嵌對象的屬性。
第一次使用我們需要安裝 glom:
from glom import glom
df = pd.read_json('nested_deep.json')
data = df['students'].apply(lambda row: glom(row, 'grade.math'))
print(data)