前提・実現したいこと
pythonと統計ダッシュボードのAPIを使って特定の地域のJSON形式のデータを取得し、表の形にしてExcelファイルにまとめようとしています。
データを1項目ずつ取得した後、pd.mergeを使ってデータフレームを結合しようとしているのですが、エラーが出てしまいます。
(6/21編集)
ppaulさんに指摘を受けた箇所を修正してみたのですが、やはり同じエラーが出ます。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "D:\Python\統計ダッシュボード_市区町村.py", line 136, in <module> main() File "D:\Python\統計ダッシュボード_市区町村.py", line 71, in main kekka=pd.merge(kekka,tmpdf,on=u'調査年',how='outer',sort='True') File "C:\Python27\ArcGISx6410.6\lib\site-packages\pandas\core\reshape\merge.py", line 48, in merge return op.get_result() File "C:\Python27\ArcGISx6410.6\lib\site-packages\pandas\core\reshape\merge.py", line 552, in get_result rdata.items, rsuf) File "C:\Python27\ArcGISx6410.6\lib\site-packages\pandas\core\internals\managers.py", line 1984, in items_overlap_with_suffix return (_transform_index(left, lrenamer), File "C:\Python27\ArcGISx6410.6\lib\site-packages\pandas\core\internals\managers.py", line 2004, in _transform_index items = [func(x) for x in index] File "C:\Python27\ArcGISx6410.6\lib\site-packages\pandas\core\internals\managers.py", line 1976, in lrenamer return '{x}{lsuffix}'.format(x=x, lsuffix=lsuffix) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
該当のソースコード
python2.7
1#coding:cp932 2 3import requests 4import pandas as pd 5import json 6from pandas.io.json import json_normalize 7import openpyxl 8 9#保存場所 10#fpath='D:\Python\統計ダッシュボード' #以下に修正 11fpath=u'D:\Python\統計ダッシュボード' 12 13#市区町村名 14#City='旧仙台市'#以下に修正 15City=u'旧仙台市' 16CityCode='04201' 17 18#リクエストurl 19#GETメソッドで送る 20baseurl='https://dashboard.e-stat.go.jp/api/1.0/' 21 22def main(): 23 24 #リスト読み込み 25 26 #toukei_list=fpath+"\"+u'系列コード.csv'#以下に修正 27 toukei_list=fpath+"\"+u'系列コード.csv' 28 29 #dtypeで指定しないと頭の0が落ちて戻せない 30 df=pd.read_csv(toukei_list, sep=',',encoding='cp932',dtype='object') 31 # 32 codelist=list(df[u'系列コード']) 33 komoku=list(df[u'項目名']) 34 kflg=list(df[u'結合フラグ']) 35 36 #空の辞書 37 params={} 38 39 #保存名 40 filename=fpath+"\"+CityCode+"_"+City+".xlsx" 41 42 geturl=baseurl+'Json/getData?' 43 44 #excel 45 wb=openpyxl.Workbook() 46 wb.save(filename) 47 with pd.ExcelWriter(filename,mode='a') as file: 48 df.to_excel(file,sheet_name=u'コード一覧',index=False) 49 wb=openpyxl.load_workbook(filename) 50 wb.remove(wb['Sheet']) 51 wb.save(filename) 52 53 54 #送信 55 for i in range(0,len(codelist)): 56 params={ 57 'IndicatorCode':codelist[i], 58 'RegionCode':CityCode, 59 'Lang':'JP', 60 'MetaGetFlg':'Y', 61 'SectionHeaderFlg':'1', 62 } 63 res=requests.get(geturl,params=params) 64 tmpdf=seikei(res.text) 65 66 if i==0: 67 kekka=tmpdf.copy() 68 69 else: 70 if kflg[i]==kflg[i-1]: 71 #調査年をキーとして結合する 72 kekka=pd.merge(kekka,tmpdf,on=u'調査年',how='outer',sort='True') 73 else: 74 with pd.ExcelWriter(filename,mode='a') as file: 75 kekka.to_excel(file,sheet_name=kflg[i-1],index=False) 76 try:#最終行でエラー 77 if kflg[i]==kflg[i+1]: 78 kekka=tmpdf.copy() 79 else: 80 with pd.ExcelWriter(filename,mode='a') as file: 81 tmpdf.to_excel(file,sheet_name=kflg[i],index=False) 82 except: 83 with pd.ExcelWriter(filename,mode='a') as file: 84 tmpdf.to_excel(file,sheet_name=kflg[i],index=False) 85 86def seikei(resp): 87 #辞書にする 88 d=json.loads(resp) 89 #result取り出し 90 if d['GET_STATS']['RESULT']['status']=='0': 91 #データ取得 92 dic2=d['GET_STATS']['STATISTICAL_DATA']['DATA_INF']['DATA_OBJ'] 93 kdf=json_normalize(dic2) 94 #調査年と値を取り出し 95 kdf=kdf.loc[:,['VALUE.@time','VALUE.$']] 96 #列見出し取り出し 97 dic3=d['GET_STATS']['STATISTICAL_DATA']['CLASS_INF']['CLASS_OBJ'][0]['CLASS'][0] 98 tname=dic3['@name'] 99 #値の列の見出しをリネーム 100 dfnew=kdf.rename(columns={'VALUE.$':tname,'VALUE.@time':u'調査年'}) 101 dfnew[u'調査年']=dfnew[u'調査年'].str.replace('CY00','') 102 #floatに変換 103 StrtoFloat(dfnew,tname) 104 #くりあー 105 dic2[:]=[] 106 dic3.clear() 107 #データがない時の処理 108 elif d['GET_STATS']['RESULT']['status']=='1': 109 #系列コード取り出し 110 nodatacode=d['GET_STATS']['PARAMETER']['indicatorCode'][0] 111 dfnew=pd.DataFrame({u'調査年':'NODATA', 112 u'系列コード':nodatacode 113 } 114 ,index=[0]) 115 116 return dfnew 117 118def StrtoFloat(data,string): 119 #https://qiita.com/github-nakasho/items/796eaa24b5622bc93ea2 120 if(data[string].dtype==object): 121 #string列の-とXじゃない行はfloatにする 122 data[string]=data[string].where((data[string] != '-') & (data[string] != 'X')).astype(float) 123 #NaNを'-'にする 124 data[string]=data[string].fillna('-')
■系列コード.csv
系列コード,項目名,出典,出典コード,結合フラグ 0201010000000010000,総人口(総数),国勢調査,00200521,年齢3区分 0201010010000010010,総人口(0~14歳),国勢調査,00200521,年齢3区分 0201010010000010020,総人口(15~64歳),国勢調査,00200521,年齢3区分 0201010010000010030,総人口(65歳以上),国勢調査,00200521,年齢3区分 0202000000000010000,世帯数(総数),国勢調査,00200521,世帯・家族類型 0202010000000010010,一般世帯数,国勢調査,00200521,世帯・家族類型 0202010101000010010,親族のみの世帯数,国勢調査,00200521,世帯・家族類型 0202010101000010020,核家族世帯,国勢調査,00200521,世帯・家族類型 0202010101000010030,核家族以外の世帯,国勢調査,00200521,世帯・家族類型 0202010102000010010,非親族を含む世帯,国勢調査,00200521,世帯・家族類型 0202010103000010020,単独世帯,国勢調査,00200521,世帯・家族類型 0202010300000010010,高齢夫婦世帯数(高齢夫婦のみ),国勢調査,00200521,世帯・家族類型 0202010401000010010,高齢単身世帯数(65歳以上の者1人),国勢調査,00200521,世帯・家族類型
試したこと
・エラー行が
#調査年をキーとして結合する kekka=pd.merge(kekka,tmpdf,on=u'調査年',how='outer',sort='True')
なので、直前にprint(kekka)とprint(tmpdf)を入れて見てみたが
両方に「調査年」列が存在していた
■気になっていること
・tmpdfの列の順番が[系列コード,調査年]となっている
・「#データがない時の処理」はエラーが出る前にも1度通っており、その時はエラーが出ず期待通りデータフレームが結合されている
原因がわかる方アドバイスをお願いします…
補足情報(FW/ツールのバージョンなど)
Python2.7
windows10
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。