我從政府公開資訊網站抓資料
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'
首先
你要先了解 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
來,我們把你的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'這記錄?
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 ?
你要不要順便把參考資料貼一下?
這就是傳說中的複製貼上也貼錯.
看起來是中間還有,但是有什麼就... 我先想想
之前分段處理,我組合好了如下,中間試了很多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