iT邦幫忙

1

初學者json格式請教

我從政府公開資訊網站抓資料

import json
import requests
res=requests.get('http://data.ntpc.gov.tw/api/v1/rest/datastore/382000000A-000221-001')

再load下來成為dictionary

result = json.loads(res.text)

結果如下
{'success': True,
'result': {'resource_id': '382000000A-000221-001',
'limit': 2000,
'total': 2000,
'fields': [{'type': 'text', 'id': 'district'},
{'type': 'text', 'id': 'rps01'},
{'type': 'text', 'id': 'rps02'},
{'type': 'text', 'id': 'rps03'},
{'type': 'text', 'id': 'rps04'},
{'type': 'text', 'id': 'rps05'},
{'type': 'text', 'id': 'rps06'},
{'type': 'text', 'id': 'rps07'},
{'type': 'text', 'id': 'rps08'},
{'type': 'text', 'id': 'rps09'},
{'type': 'text', 'id': 'rps10'},
{'type': 'text', 'id': 'rps11'},
{'type': 'text', 'id': 'rps12'},
{'type': 'text', 'id': 'rps13'},
{'type': 'text', 'id': 'rps14'},
{'type': 'text', 'id': 'rps15'},
{'type': 'text', 'id': 'rps16'},
{'type': 'text', 'id': 'rps17'},
{'type': 'text', 'id': 'rps18'},
{'type': 'text', 'id': 'rps19'},
{'type': 'text', 'id': 'rps20'},
{'type': 'text', 'id': 'rps21'},
{'type': 'text', 'id': 'rps22'},
{'type': 'text', 'id': 'rps23'},
{'type': 'text', 'id': 'rps24'},
{'type': 'text', 'id': 'rps25'},
{'type': 'text', 'id': 'rps26'},
{'type': 'text', 'id': 'rps27'}],
'records': [{'district': '土城區',
'rps01': '房地(土地+建物)',
'rps02': '新北市土城區大暖路61~90號',
'rps03': '57.58',
'rps04': '住',
'rps05': '',
'rps06': '',
'rps07': '1080603',
'rps08': '土地3建物1車位0',
'rps09': '全',
'rps10': '二層',
'rps11': '透天厝',
'rps12': '住家用',
'rps13': '加強磚造',
'rps14': '0641231',
'rps15': '94.5',
'rps16': '3',
'rps17': '1',
'rps18': '2',
'rps19': '有',
'rps20': '無',
'rps21': '8000000',
'rps22': '84656',
'rps23': '',
'rps24': '0',
'rps25': '0',
'rps26': '防火巷及頂樓增建。',
'rps27': 'RPRQMLMKQHOFFAF68CA'},
{'district': '板橋區',
'rps01': '房地(土地+建物)',
'rps02': '新北市板橋區重慶路93巷1~30號',
'rps03': '22.6',
'rps04': '商',
'rps05': '',
'rps06': '',
'rps07': '1080715',
'rps08': '土地1建物1車位0',
'rps09': '二層,陽台',
'rps10': '五層',
'rps11': '公寓(5樓含以下無電梯)',
'rps12': '住家用',
'rps13': '鋼筋混凝土造',
'rps14': '0690828',
'rps15': '99.05',
'rps16': '4',
'rps17': '3',
'rps18': '3',
'rps19': '有',
'rps20': '無',
'rps21': '12580000',
'rps22': '127007',
'rps23': '',
'rps24': '0',
'rps25': '0',
'rps26': '含增建或未登記建物。',
'rps27': 'RPVQMLMKQHOFFAF09CA'},
但我只想要 'records'內的資料,我下的指令如下

df2=pd.DataFrame()
for rd in df['records']:
    df2=df2.append(pd.Dataframe(rd))
df2

為何出現錯誤?
KeyError: 'records'

5
dragonH
iT邦大師 1 級 ‧ 2019-11-05 09:40:06
最佳解答

首先

你要先了解 data 的格式

data 是長這樣

{
    success: true,
    result: {
        ...
        records: [
            {
                district: "土城區",
                rps01: "房地(土地+建物)",
                rps02: "新北市土城區大暖路61~90號",
                rps03: "57.58",
                rps04: "住",
                rps05: "",
                rps06: "",
                rps07: "1080603",
                rps08: "土地3建物1車位0",
                rps09: "全",
                rps10: "二層",
                rps11: "透天厝",
                rps12: "住家用",
                rps13: "加強磚造",
                rps14: "0641231",
                rps15: "94.5",
                rps16: "3",
                rps17: "1",
                rps18: "2",
                rps19: "有",
                rps20: "無",
                rps21: "8000000",
                rps22: "84656",
                rps23: "",
                rps24: "0",
                rps25: "0",
                rps26: "防火巷及頂樓增建。",
                rps27: "RPRQMLMKQHOFFAF68CA"
            },
        ]        
    }
}

所以你想要拿到 records 的資料

前面還會有一層 result

然後其實 requests 就有 res.json() 可以用

所以 code 會長成這樣

import requests
import pandas as pd

res=requests.get('http://data.ntpc.gov.tw/api/v1/rest/datastore/382000000A-000221-001')
data = res.json()
df=pd.DataFrame(data['result']['records'])
df2=pd.DataFrame()
for rd in df:
    df2=df2.append(pd.DataFrame(rd))

後面那段我不知道你想做什麼

就先不提了

不過真要 append 到 df2 的話

那樣估計會有 error

然後 DataFrame !== Dataframe

chifeng iT邦新手 5 級 ‧ 2019-11-05 10:07:14 檢舉

感謝您,後面append的確多此一舉

chifeng iT邦新手 5 級 ‧ 2019-11-05 10:29:00 檢舉

真的不是很懂的是,一般來說code不是json.load()
.json()二者差異,還是想請教高手大大

dragonH iT邦大師 1 級 ‧ 2019-11-05 10:35:02 檢舉

你指的

json.load()

是一個叫做 json 的 module

他裡面的一個 method

我指的 .json

requests 這個 module 裡的一個 method

他們兩個在你這案例所做的

基本上是一樣的事

都是把 data 轉成 json 這種格式

1
阿展展展
iT邦研究生 2 級 ‧ 2019-11-05 05:50:12
  1. 你是要抓一個 records 還是要抓一堆 records
  2. 為什麼會有 for
  3. 你知道 key 跟 value 之間的關係嗎
  4. 錯誤訊息是什麼
chifeng iT邦新手 5 級 ‧ 2019-11-05 06:03:05 檢舉

我要把records一筆一筆抓下來放到dataframe裡面,所以用for迴圈,records是key,但出現KeyError,謝謝,還請您指教

0
froce
iT邦大師 4 級 ‧ 2019-11-05 06:25:07

來,我們把你的code組合起來看看:

import json
import requests
res=requests.get('http://data.ntpc.gov.tw/api/v1/rest/datastore/382000000A-000221-001')

result = json.loads(res.text)

df2=pd.DataFrame()
for rd in df['records']:
    df2=df2.append(pd.Dataframe(rd))
df2

你根本沒把result存到dataframe,有程式語言那麼聰明,知道你要把result轉成dataframe的嗎?
你dataframe根本是空的...哪來有'records'這記錄?

chifeng iT邦新手 5 級 ‧ 2019-11-05 08:41:45 檢舉

我分段試了指令
的確少抄錄了一段

import json
import requests
res=requests.get('http://data.ntpc.gov.tw/api/v1/rest/datastore/382000000A-000221-001')
result = json.loads(res.text)
import pandas as pd
df=pd.DataFrame(result)
df2=pd.DataFrame()
for rd in df['records']:
    df2=df2.append(pd.Dataframe(rd))
df2
1
小魚
iT邦大師 1 級 ‧ 2019-11-05 08:24:44
import json
import requests
res=requests.get('http://data.ntpc.gov.tw/api/v1/rest/datastore/382000000A-000221-001')

result = json.loads(res.text)

df2=pd.DataFrame()
for rd in df['records']:
    df2=df2.append(pd.Dataframe(rd))
df2

哪來的df ?

你要不要順便把參考資料貼一下?
這就是傳說中的複製貼上也貼錯.

阿展展展 iT邦研究生 2 級 ‧ 2019-11-05 08:34:10 檢舉

看起來是中間還有,但是有什麼就... 我先想想/images/emoticon/emoticon70.gif

chifeng iT邦新手 5 級 ‧ 2019-11-05 08:45:20 檢舉

之前分段處理,我組合好了如下,中間試了很多code所以漏了放到dataframe這段

import json
import requests
res=requests.get('http://data.ntpc.gov.tw/api/v1/rest/datastore/382000000A-000221-001')
result = json.loads(res.text)
import pandas as pd
df=pd.DataFrame(result)
df2=pd.DataFrame()
for rd in df['records']:
    df2=df2.append(pd.Dataframe(rd))
df2

我要發表回答

立即登入回答