iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
Software Development

從零開始Pandas-外加一點Matplotlib系列 第 8

Day7: 資料讀寫 - JSON/關於orientation

  • 分享至 

  • xImage
  •  

JSON的讀取方式和csv、excel有點不同,所以拉出來獨立一篇,當然也是昨天寫到excel就已經11:50了,沒有摳打可以讓我再展開講講。

在進入讀取之前,先了解一下pandas在json提供名為 orientation 的參數,pandas依據這個參數來解析不同結構的json資料。orientation總共有六個,table很少用,今天只介紹其他五個。

orientation

orientation的結構分成dicionary字典和list串列兩大類:

  • dictionary有三種

    • columns: 預設選項,以欄位為key,value是欄位值的字典。
    • index:以索引標籤為key,value是該索引列,格式為『欄位名稱:欄位值』的字典。
    • split:固定3個key的字典,這三個key是columns、index、data,value值是其對應的陣列。
  • list有兩種

    • record:由dictionary組成的list,每一個dictionary是一個row/一列,dictionary格式為『欄位名稱:欄位值』。
    • value:單純由資料列list組成的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] 陣列包陣列
  • Dictionary data
#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]
    ]
}
  • List data
#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 ]
]

read_json

頭過身就過,過了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

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和排序開始!


上一篇
Day6: 資料讀寫
下一篇
Day8: Index和排序
系列文
從零開始Pandas-外加一點Matplotlib11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言