質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

1222閲覧

python2.7 pd.mergeでUnicodeEncodeErrorが出ます

pia

総合スコア14

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/06/18 06:41

編集2021/06/21 00:48

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

Python

1 #調査年をキーとして結合する 2 kekka=pd.merge(kekka,tmpdf,on=u'調査年',how='outer',sort='True')

において、ループの2回目のときには「u'調査列'」だけではなく「u'系列コード'」列も重複していることが原因ではないかと思いつきました。
なので

Python

1 #調査年をキーとして結合する 2 kekka=pd.merge(kekka,tmpdf,how='outer',sort='True')

としたところ、エラーが出なくなりました。

投稿2021/06/21 01:53

pia

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

pyhotn2.7を使っているなら、

fpath='D:\Python\統計ダッシュボード'

は、

fpath=u'D:\Python\統計ダッシュボード'

City='旧仙台市'

は、

City=u'旧仙台市'

とかに修正しないとそもそも動きません。

将来のことを考えると、Python3系への移行をお勧めします。

投稿2021/06/18 06:56

ppaul

総合スコア24668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pia

2021/06/18 07:12

>fpath=u'D:\Python\統計ダッシュボード' >City=u'旧仙台市' 元のコードでエラー直前までは動いており、Excelファイルも作成できているのですが、そこを直さないとエラーが直らないということでしょうか?
ppaul

2021/06/18 08:51

python2.7では、ユニコード文字列を使う場合はu''とかu""を使わなければなりません。 たまたま動いているという理由で使い続けたいのであれば、今後予想していなかったエラーが発生する可能性はあります。それは気にしないで使い続けたいというのは個人の自由です。」
pia

2021/06/18 14:53 編集

普段は常にu'なんとか'の形で書いているのですが、確かデータフレームとかリクエストのあたりでエラーが出るんでu'を取ったような気がします。その辺は最初の方に書いたので詳しいことは忘れてしまいました。 今回出ているエラーには関係ない話ということで良いのでしょうか。今回出ているエラーを直したいので…
pia

2021/06/21 00:49

ご指摘いただいたところを修正してみましたが、エラーは変わりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問