Python學習筆記第五十六天
- Pandas JSON
- read_json()
- to_string()
- 字典轉為 DataFrame 數據
- 內嵌的 JSON 數據
- json_normalize()
- 后記
Pandas JSON
JSON(JavaScript Object Notation,JavaScript 對象表示法),是存儲和交換文本信息的語法,類似 XML。
JSON 比 XML 更小、更快,更易解析,更多 JSON 內容可以參考 JSON 教程。
Pandas 可以很方便的處理 JSON 數據,本文以 sites.json 為例,內容如下:
[{"id": "A001","name": "百度","url": "www.baidu.com","likes": 95},{"id": "A002","name": "Google","url": "www.google.com","likes": 112},{"id": "A003","name": "淘寶","url": "www.taobao.com","likes": 66}
]
read_json()
# 實例 1
import pandas as pd
df = pd.read_json('sites.json')
print(df.to_string())
to_string()
to_string() 用于返回 DataFrame 類型的數據,我們也可以直接處理 JSON 字符串。
# 實例 2
import pandas as pd
data =[{"id": "A001","name": "百度","url": "www.baidu.com","likes": 95},{"id": "A002","name": "Google","url": "www.google.com","likes": 112},{"id": "A003","name": "淘寶","url": "www.taobao.com","likes": 66}
]
df = pd.DataFrame(data)
print(df)
字典轉為 DataFrame 數據
JSON 對象與 Python 字典具有相同的格式,所以我們可以直接將 Python 字典轉化為 DataFrame 數據:
# 實例 3
import pandas as pd
# 字典格式的 JSON
s = {"col1":{"row1":1,"row2":2,"row3":3},"col2":{"row1":"x","row2":"y","row3":"z"}
}
# 讀取 JSON 轉為 DataFrame
df = pd.DataFrame(s)
print(df)
內嵌的 JSON 數據
假設有一組內嵌的 JSON 數據文件 nested_list.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}]
}
使用以下代碼格式化完整內容:
# 實例 4
import pandas as pd
df = pd.read_json('nested_list.json')
print(df)
json_normalize()
這時我們就需要使用到 json_normalize() 方法將內嵌的數據完整的解析出來:
# 實例 5
import pandas as pd
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 參數來顯示這些元數據:
# 實例 6
import pandas as pd
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'],meta=['school_name', 'class']
)
print(df_nested_list)
接下來,讓我們嘗試讀取更復雜的 JSON 數據,該數據嵌套了列表和字典,數據文件 nested_mix.json 如下:
nested_mix.json 文件內容
{"school_name": "local primary school","class": "Year 1","info": {"president": "John Kasich","address": "ABC road, London, UK","contacts": {"email": "admin@e.com","tel": "123456789"}},"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}]
}
nested_mix.json 文件轉換為 DataFrame:
# 實例 7
import pandas as pd
import json
# 使用 Python JSON 模塊載入數據
with open('nested_mix.json','r') as f:data = json.loads(f.read())
df = pd.json_normalize(data,record_path =['students'],meta=['class',['info', 'president'],['info', 'contacts', 'tel']]
)
print(df)
讀取內嵌數據中的一組數據
以下是實例文件 nested_deep.json,我們只讀取內嵌中的 math 字段:
nested_deep.json 文件內容
{"school_name": "local primary school","class": "Year 1","students": [{"id": "A001","name": "Tom","grade": {"math": 60,"physics": 66,"chemistry": 61}},{"id": "A002","name": "James","grade": {"math": 89,"physics": 76,"chemistry": 51}},{"id": "A003","name": "Jenny","grade": {"math": 79,"physics": 90,"chemistry": 78}}]
}
這里我們需要使用到 glom 模塊來處理數據套嵌,glom 模塊允許我們使用 . 來訪問內嵌對象的屬性。
第一次使用我們需要安裝 glom:
pip3 install glom
正確地使用了 glom 模塊來從嵌套的 JSON 數據中提取字段
# 實例 8
import pandas as pd
from glom import glom
df = pd.read_json('nested_deep.json')
data = df['students'].apply(lambda row: glom(row, 'grade.math'))
print(data)
以下是對代碼的詳細解釋:
- 首先,我們導入了 pandas 和 glom 模塊。pandas 是一個用于數據操作和分析的 Python 庫,而 glom 是一個用于操作和解析 JSON 數據的庫。
- 然后,我們使用 pandas 的 read_json 函數讀取了一個名為 ‘nested_deep.json’ 的 JSON 文件。這個文件包含了一些有關學生和他們的成績的信息。
- 我們創建了一個名為 data 的變量,并使用 apply 函數和 lambda 函數來遍歷 df[‘students’] 列中的每一行。對于每一行,我們使用 glom 函數來提取該行的 ‘grade’ 對象中的 ‘math’ 字段。
- 最后,我們打印了 data 變量,這個變量應該包含了所有學生的數學成績。
如果您運行這段代碼,并確保您的環境已經安裝了 pandas 和 glom,那么應該會看到一個包含所有學生數學成績的列表。
后記
今天學習的是Python Pandas JSON學會了嗎。 今天學習內容總結一下:
- Pandas JSON
- read_json()
- to_string()
- 字典轉為 DataFrame 數據
- 內嵌的 JSON 數據
- json_normalize()