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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

Q&A

解決済

1回答

6647閲覧

Pythonでcsvの緯度経度から都道府県を判明(逆ジオコーディング)したいです

furuit

総合スコア19

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

0グッド

0クリップ

投稿2022/01/10 17:45

やりたいこと

プログラミング初心者の学生です
提出間近の卒論で詰まっているので教えて欲しいです...
緯度経度含む以下のようなcsvファイルから,逆ジオコーディングして住所(必要なのは都道府県のみ)を明らかにしたいです

sample.csv

1Unnamed: 0,created_at,text,x,y 20,2021-01-19T14:07:23.000Z,"こんにちは",129.8709379,32.75250816

以下が理想のcsvファイルです

result.csv

1Unnamed: 0,created_at,text,x,y,area 20,2021-01-19T14:07:23.000Z,"こんにちは",129.8709379,32.75250816,東京都

現状の問題点

以下のサイトを参考にしました
Pythonで逆ジオコーディング【国土地理院API】

以下のコードを実行したのですが,元のcsvファイルに都道府県がついた新しいcsvファイルが出力されません
(エラーも何も出ずターミナルの実行が終わります)
新しくできたcsvファイルを保存できていないからでしょうか?

reverse_geocoding.py

1import pandas as pd 2from urllib import request,parse 3import json 4 5class ReverseGeocoding(): 6 def create_reversed_geocoding_dataset(self): 7 df1 = pd.merge(self._set_muniCdCode(),self._reverse_geocoding(),on='muniCd',how='inner') 8 df2 = pd.merge(self._create_yamanote_dataframe(),df1,left_index=True,right_index=True) 9 return df2 10 def _reverse_geocoding(self): 11 df=self._create_yamanote_dataframe() 12 reverse = [] 13 lat = df['latitude'] 14 lon = df['longitude'] 15 for a,b in zip(lat,lon): 16 endpoint_url = 'https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress' 17 params={ 18 'lat':a, 19 'lon':b 20 } 21 res = requests.get(endpoint_url,params=params) 22 data = res.json() 23 d = data['results'] 24 reverse.append(d) 25 df1 = pd.io.json.json_normalize(reverse).astype({'muniCd': str}) 26 return df1 27 def _set_muniCdCode(self): 28 muniCd=pd.read_csv('data/municode.csv').astype({'muniCd': str}).drop(columns=['id','n']) 29 return muniCd 30 def _create_yamanote_dataframe(self): 31 df=pd.read_csv('自分の入力したcsvファイル') 32 return df

試したこと

クラスを設定しただけで実行できていないということなのか,わかっていないです
逆ジオコーディングした結果のcsvファイルを保存する方法を教えていただけたら嬉しいです

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

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

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

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

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

guest

回答1

0

ベストアンサー

プログラムコードの方が正しいと仮定すれば、入力する CSV ファイルのヘッダ行は以下の様になるはずです。

csv

1Unnamed: 0,created_at,text,longitude,latitude 20,2021-01-19T14:07:23.000Z,"こんにちは",129.8709379,32.75250816

これで実行してみると、以下の様なデータフレームが作成されます。

Pandas

1 Unnamed: 0 created_at text longitude latitude chiriin_pref_name muniCd chiriin_city_name lv01Nm 20 0 2021-01-19T14:07:23.000Z こんにちは 129.870938 32.752508 0 長崎県 42201 長崎市 尾上町

投稿2022/01/10 19:08

melian

総合スコア20655

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

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

furuit

2022/01/10 19:15

回答してくださって本当にありがとうございます ただ,入力する CSV ファイルのヘッダ行のx,yをlongitude,latitudeに変更してもその結果にならないです... (エラーなく実行はできるのですが,新しい結果が表示されないです...)
melian

2022/01/10 19:26

こちらでは print(ReverseGeocoding().create_reversed_geocoding_dataset()) を実行しています。
furuit

2022/01/10 20:07

ありがとうございます!!! 実行はできたのですが, ””” Traceback (most recent call last): File "reverse_geocoding.py", line 34, in <module> print(ReverseGeocoding().create_reversed_geocoding_dataset()) File "reverse_geocoding.py", line 7, in create_reversed_geocoding_dataset df1 = pd.merge(self._set_muniCdCode(),self._reverse_geocoding(),on='muniCd',how='inner') File "reverse_geocoding.py", line 21, in _reverse_geocoding res = requests.get(endpoint_url,params=params) NameError: name 'requests' is not defined ””” 'requestsがないとエラーが出ました... pipとrequestsをアップデートしても治らず困惑しています ちょっといろいろな記事を読んで頑張ってみようと思いますが,もし改善方法をご存知でしたら教えていただければとても嬉しいです...
melian

2022/01/10 20:09

import requests を reverse_geocoding.py の先頭辺りに追加して下さい。
furuit

2022/01/10 20:18 編集

即レスくださりありがとうございます!!! import requestsを追加したら今度は ””” Traceback (most recent call last): File "reverse_geocoding.py", line 35, in <module> print(ReverseGeocoding().create_reversed_geocoding_dataset()) File "reverse_geocoding.py", line 8, in create_reversed_geocoding_dataset df1 = pd.merge(self._set_muniCdCode(),self._reverse_geocoding(),on='muniCd',how='inner') File "reverse_geocoding.py", line 24, in _reverse_geocoding d = data['results'] KeyError: 'results' ””” が出てしまったので,これもちょっと調べながらやってみます... (何度も申し訳ありません...)
melian

2022/01/10 20:24

う〜ん、考えられるのは requests パッケージが既定のパス以外にインストールされているのではないかという状況ですね。。。
furuit

2022/01/10 20:37 編集

なるほど,, 一応確認したのですが現在のパス(環境?)にrequests パッケージは入っていました... 以下のコードは,ネット上にあるjsonファイルを読み込んでいるのですが,私がやりたいことは ローカルで自分が持っている元のcsvファイルに含まれる緯度経度を, 同じくローカルで自分が持っている,muniCdという緯度経度と住所の対応表(csv)から 逆ジオコーディングすることなので,下の部分が間違っているのかな?と思っているんですけど, どんなふうに直せばいいかわからなくて,, (元と記事ではネット上にあるjsonファイルの緯度経度を変換しようとしているから状況が違うのでは?という...)(間違っていたらごめんなさい) """ def _reverse_geocoding(self): df=self._create_yamanote_dataframe() reverse = [] lat = df['latitude'] lon = df['longitude'] for a,b in zip(lat,lon): endpoint_url = 'https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress' params={ 'lat':a, 'lon':b } res = requests.get(endpoint_url,params=params) data = res.json() d = data['results'] reverse.append(d) df1 = pd.io.json.json_normalize(reverse).astype({'muniCd': str}) return df1 """
melian

2022/01/10 20:47

ああ、すみません、「requests パッケージが既定のパス以外にインストールされている」云々は忘れて下さい。ボケてて勘違いしてしまいました。 KeyError: 'results' が出るのは指定した緯度と経度が日本国外の位置になっている可能性が高いです。例えば、緯度と経度が逆になっているということはありませんか?
xail2222

2022/01/10 21:57

横からすみません。余計なコメントかもしれませんが melianさんのコメントの通りなのですが、inputとなるcsvのデータのデータ量が多いかもしれないので 緯度経度が逆になっていなくても、一つでも日本国外であれば該当のエラーになると思うので 結果が取得できなかったら処理を飛ばすとか取得できなかった時の処理を入れておく必要があるんじゃないでしょうか。 if 'results' in data: とかで調べて。
furuit

2022/01/10 21:59

返信本当にありがとうぎざいます 元々のcsvデータで,緯度経度のカラムが空のものがあったのでそれは取り除いてやってみました しかし,下のようなエラーが変わらず出ます,, ””” reverse_geocoding.py:26: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead df1 = pd.io.json.json_normalize(reverse).astype({'muniCd': str}) Traceback (most recent call last): File "reverse_geocoding.py", line 35, in <module> print(ReverseGeocoding().create_reversed_geocoding_dataset()) File "reverse_geocoding.py", line 8, in create_reversed_geocoding_dataset df1 = pd.merge(self._set_muniCdCode(),self._reverse_geocoding(),on='muniCd',how='inner') File "reverse_geocoding.py", line 24, in _reverse_geocoding d = data['results'] KeyError: 'results' ””” 正直わかんないのですが,調べ直してみます,,
furuit

2022/01/10 22:02

xail2222さん 教えてくださりありがとうございます!!! 日本国外のデータ絶対あります,, なるほど!!! 結果が取得できなかったら処理を飛ばすの調べてみます
furuit

2022/01/10 22:08 編集

できました!!!!!!お二方とも本当にありがとうございます!!! 最後に1つだけ教えてください,,, print(ReverseGeocoding().create_reversed_geocoding_dataset()) でプリントするのではなくて,新しいcsvファイルに保存したいです その場合,df.to_csvでどのように書けばいいのでしょうか???
furuit

2022/01/10 22:15

すいません,できました!!! 本当にありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問