JSON的讀取方式和csv、excel有點不同,所以拉出來獨立一篇,當然也是昨天寫到excel就已經11:50了,沒有摳打可以讓我再展開講講。
在進入讀取之前,先了解一下pandas在json提供名為 orientation 的參數,pandas依據這個參數來解析不同結構的json資料。orientation總共有六個,table很少用,今天只介紹其他五個。
orientation的結構分成dicionary字典和list串列兩大類:
dictionary有三種
list有兩種
orient | structure | desc |
---|---|---|
columns | {column -> {index -> value}} | 字典包字典,key為column。 |
index | {index -> {column -> value}} | 字典包字典,key為index。 |
split | {index -> [index], columns -> [columns], data -> [values]} | 固定3個key[index,data,value]的字典 |
records | [{column -> value}, ... , {column -> value}] | 陣列包字典 |
value | [value, value, value] | 陣列包陣列 |
#columns.json
{
"name": {
"0": "Bojack",
"1": "Joan",
"2": "Carolyn"
},
"score": {
"0": 88,
"1": 98,
"2": 93
},
"grade": {
"0": 9,
"1": 8,
"2": 9
}
}
#index.json
{
"0": {
"name": "Bojack",
"score": 88,
"grade": 9
},
"1": {
"name": "Joan",
"score": 98,
"grade": 8
},
"2": {
"name": "Carolyn",
"score": 95,
"grade": 9
}
}
#split.json
{
"columns":["name","score","grade"],
"index":[0,1,2],
"data":[
["Bojack",88,9],
["Joan",98,8],
["Carolyn",95,9]
]
}
#records.json
[
{ "name": "Bojack", "score": 88, "grade": 9 },
{ "name": "Joan", "score": 98, "grade": 8 },
{ "name": "Carolyn", "score": 95, "grade": 9 }
]
#values.json
[
[ "Bojack", 88, 9 ],
[ "Joan", 98, 8 ],
[ "Carolyn", 95, 9 ]
]
頭過身就過,過了orientation,存取json就是一塊小蛋糕。
語法:pd.read_json('檔案名稱',orient='orientation')
pd.read_json('columns.json', orient='columns')
pd.read_json('index.json', orient='index')
pd.read_json('split.json', orient='split')
pd.read_json('records.json', orient='records')
pd.read_json('value.json', orient='values')
除了values以外的orientation都有索引和欄位名稱,把他們print出來長這樣
# | name | score | grade |
---|---|---|---|
0 | Bojack | 88 | 9 |
1 | Joan | 98 | 8 |
2 | Carolyn | 95 | 9 |
然而value長這樣
# | 0 | 1 | 2 |
---|---|---|---|
0 | Bojack | 88 | 9 |
1 | Joan | 98 | 8 |
2 | Carolyn | 95 | 9 |
因為前面有說到value的資料結構是data組成的陣列,沒有欄位資訊。
要怎麼讓他有欄位名稱呢?
只要在read_json後加rename,按照欄位index指定欄位名稱即可。
(pd.read_json('value.json', orient='values')
.rename(columns={0:"name", 1:"score", 2:"grade"}))
to_json也是相當簡單,同樣的dataframe用不同的orient,就會長出不同的資料結構。
語法:pd.to_json('檔案名稱',orient='orientation')
#用orientation為column的data測試
data = {"name":{"0":"Bojack","1":"Joan","2":"Carolyn"},
"score":{"0":88,"1":98,"2":93},
"grade":{"0":9,"1":8,"2":9}}
df = pd.DataFrame(data)
df.to_json("gen_columns.json", orient="columns", force_ascii=False)
df.to_json("gen_index.json", orient="index", force_ascii=False)
df.to_json("gen_split.json", orient="split", force_ascii=False)
df.to_json("gen_records.json", orient="records", force_ascii=False)
df.to_json("gen_values.json", orient="values", force_ascii=False)
終於第一周結束啦!下周開始進入Pandas的進階使用,會討論一些聚合函數和資料重塑的應用。明天先從index和排序開始!