CSVファイルの読み込みとgeopandas
今回は品川区のオープンデータを使う
https://www.city.shinagawa.tokyo.jp/PC/kuseizyoho/digitaltransformation/opendate/index.html
品川だと避難所はCSVで提供されている
他にも公共施設
AED
交通事故などもある
とりあえず今回は公共施設のCSVを使うhttps://catalog.data.metro.tokyo.lg.jp/organization/t131091?q=公共施設&sort=score+desc%2C+metadata_modified+desc
で調べたら
https://www.city.shinagawa.tokyo.jp/ct/other000081600/kokyoshisetsu.csv
のリンクになった
import requests
url = "https://www.city.shinagawa.tokyo.jp/ct/other000081600/kokyoshisetsu.csv"
save_path = "kokyoshisetsu.csv"
r = requests.get(url)
r.raise_for_status() # エラーなら例外を出す
with open(save_path, "wb") as f:
f.write(r.content)
print(f"保存しました: {save_path}")
を実行してファイルをダウンロード
このデータを使うには
まず pandas にして次にgeodataflameにする
df = pd.read_csv('./kokyoshisetsu.csv',encoding='shift-jis')
df
これで
施設名 施設名(英語) カテゴリ 電話番号 郵便番号 住所 緯度 経度 説明(日本語) 説明(英語) FAX番号 開所時間帯 開所時刻 閉所時刻 利用料金 画像URL サムネイル画像URL ホームページアドレス 創設日 創設者 0 品川区役所 Shinagawa City Office 区役所 03-3777-1111 140-0005 東京都品川区広町2-1-36 35.608837 139.73024 区役所 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 品川第一地域センター Shinagawa Dai-ichi Community Ctr. 地域センター 03-3450-2000 140-0001 東京都品川区北品川3-11-16 35.616681 139.74008 地域センター NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 品川第二地域センター Shinagawa Dai-ni Community Ctr. 地域センター 03-3472-2000 140-0004 東京都品川区南品川5-3-20 35.611373 139.74129 地域センター NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3 大崎第一地域センター Osaki Dai-ichi Community Ctr. 地域センター 03-3491-2000 141-0031 東京都品川区西五反田3-6-3 35.627776 139.71686 地域センター NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4 大崎第二地域センター Osaki Dai-ni Community Ctr. 地域センター 03-3492-2000 141-0032 東京都品川区大崎2-9-4 35.616945 139.72757 地域センター NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 753 なぎさ会館 Nagisa Funeral Hall 区民生活関連施設 03-5471-2700 140-0012 東京都品川区勝島3-1-3 35.596317 139.74173 葬祭施設 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 754 臨海斎場 NaN 区民生活関連施設 03-5755-2833 143-0001 東京都大田区東海1-3-1 35.585557 139.75282 葬祭施設 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 755 品川区消費者センター Consumers' Ctr. 区民生活関連施設 03-5718-7181 140-0014 東京都品川区大井1-14-1 大井1丁目共同ビル4階 35.607696 139.73146 消費生活相談 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 756 男女共同参画センター Equality of Gender Ctr. 区民生活関連施設 03-5479−4104 140-0011 東京都品川区東大井5−18−1品川区立総合区民会館3階 35.606177 139.73584 男女共同参画 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 757 品川区就業センター NaN 区民生活関連施設 03-5498-6353 141-0033 東京都品川区西品川1-28-3 35.609295 139.72769 就業支援 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 758 rows × 20 columns
となる
施設名から経度まではデータがあるが
それ以降はデータがないので読み込む部分を指定する
絞り込みは df.locを使う
しかし
df = df.loc[:,'施設名':'経度']
で何も表示されない
print(df.columns.tolist())
で調べたら
['施設名', '施設名(英語)', 'カテゴリ', '電話番号', '郵便番号', '住所', '緯度', '経度'] subset = df.loc[:, '施設名':'経度'] subset
としたら表示された
単純に最後にdfを表示しないだけだった
df = df.loc[:, '施設名':'経度'] df
で
施設名 施設名(英語) カテゴリ 電話番号 郵便番号 住所 緯度 経度 0 品川区役所 Shinagawa City Office 区役所 03-3777-1111 140-0005 東京都品川区広町2-1-36 35.608837 139.73024 1 品川第一地域センター Shinagawa Dai-ichi Community Ctr. 地域センター 03-3450-2000 140-0001 東京都品川区北品川3-11-16 35.616681 139.74008 2 品川第二地域センター Shinagawa Dai-ni Community Ctr. 地域センター 03-3472-2000 140-0004 東京都品川区南品川5-3-20 35.611373 139.74129 3 大崎第一地域センター Osaki Dai-ichi Community Ctr. 地域センター 03-3491-2000 141-0031 東京都品川区西五反田3-6-3 35.627776 139.71686 4 大崎第二地域センター Osaki Dai-ni Community Ctr. 地域センター 03-3492-2000 141-0032 東京都品川区大崎2-9-4 35.616945 139.72757 ... ... ... ... ... ... ... ... ... 753 なぎさ会館 Nagisa Funeral Hall 区民生活関連施設 03-5471-2700 140-0012 東京都品川区勝島3-1-3 35.596317 139.74173 754 臨海斎場 NaN 区民生活関連施設 03-5755-2833 143-0001 東京都大田区東海1-3-1 35.585557 139.75282 755 品川区消費者センター Consumers' Ctr. 区民生活関連施設 03-5718-7181 140-0014 東京都品川区大井1-14-1 大井1丁目共同ビル4階 35.607696 139.73146 756 男女共同参画センター Equality of Gender Ctr. 区民生活関連施設 03-5479−4104 140-0011 東京都品川区東大井5−18−1品川区立総合区民会館3階 35.606177 139.73584 757 品川区就業センター NaN 区民生活関連施設 03-5498-6353 141-0033 東京都品川区西品川1-28-3 35.609295 139.72769 758 rows × 8 columns
となった
次に各列に対してNaNがあるか調べる
df.isna().any()
結果は
施設名 False 施設名(英語) True カテゴリ False 電話番号 True 郵便番号 False 住所 False 緯度 False 経度 False dtype: bool
これでfalseになっているものは全て入っているのが確認できる
今回のデータは必要な
施設名
住所
緯度経度
が入っているのが確認できる
次にデータタイプを確認
type(df)
で識別すると
pandas.core.frame.DataFrame
これで 冤罪は pandas の dataflameになっているのがわかる
これを geopandasへ変換する
変換するには緯度経度を使ってジオメトリ列を作成する
このジオメトリ列を使って geodataflameへ変換する
まずはジオメトリ列の作成
これは
geometry = gpd.points_from_xy(df['経度'],df['緯度'])
で簡単にできる
<GeometryArray> [ <POINT (139.73 35.609)>, <POINT (139.74 35.617)>, <POINT (139.741 35.611)>, <POINT (139.717 35.628)>, <POINT (139.728 35.617)>, <POINT (139.738 35.596)>, <POINT (139.73 35.604)>, <POINT (139.721 35.598)>, <POINT (139.706 35.619)>, <POINT (139.704 35.611)>, ... <POINT (139.749 35.622)>, <POINT (139.736 35.614)>, <POINT (139.733 35.618)>, <POINT (139.714 35.614)>, <POINT (139.753 35.608)>, <POINT (139.742 35.596)>, <POINT (139.753 35.586)>, <POINT (139.731 35.608)>, <POINT (139.736 35.606)>, <POINT (139.728 35.609)>] Length: 758, dtype: geometry
これを使って geodataflameへ変換する
gdf = gpd.GeoDataFrame(df,geometry=geometry) gdf
これで
施設名 施設名(英語) カテゴリ 電話番号 郵便番号 住所 緯度 経度 geometry 0 品川区役所 Shinagawa City Office 区役所 03-3777-1111 140-0005 東京都品川区広町2-1-36 35.608837 139.73024 POINT (139.73024 35.60884) 1 品川第一地域センター Shinagawa Dai-ichi Community Ctr. 地域センター 03-3450-2000 140-0001 東京都品川区北品川3-11-16 35.616681 139.74008 POINT (139.74008 35.61668) 2 品川第二地域センター Shinagawa Dai-ni Community Ctr. 地域センター 03-3472-2000 140-0004 東京都品川区南品川5-3-20 35.611373 139.74129 POINT (139.74129 35.61137) 3 大崎第一地域センター Osaki Dai-ichi Community Ctr. 地域センター 03-3491-2000 141-0031 東京都品川区西五反田3-6-3 35.627776 139.71686 POINT (139.71686 35.62778) 4 大崎第二地域センター Osaki Dai-ni Community Ctr. 地域センター 03-3492-2000 141-0032 東京都品川区大崎2-9-4 35.616945 139.72757 POINT (139.72757 35.61694) ... ... ... ... ... ... ... ... ... ... 753 なぎさ会館 Nagisa Funeral Hall 区民生活関連施設 03-5471-2700 140-0012 東京都品川区勝島3-1-3 35.596317 139.74173 POINT (139.74173 35.59632) 754 臨海斎場 NaN 区民生活関連施設 03-5755-2833 143-0001 東京都大田区東海1-3-1 35.585557 139.75282 POINT (139.75282 35.58556) 755 品川区消費者センター Consumers' Ctr. 区民生活関連施設 03-5718-7181 140-0014 東京都品川区大井1-14-1 大井1丁目共同ビル4階 35.607696 139.73146 POINT (139.73146 35.6077) 756 男女共同参画センター Equality of Gender Ctr. 区民生活関連施設 03-5479−4104 140-0011 東京都品川区東大井5−18−1品川区立総合区民会館3階 35.606177 139.73584 POINT (139.73584 35.60618) 757 品川区就業センター NaN 区民生活関連施設 03-5498-6353 141-0033 東京都品川区西品川1-28-3 35.609295 139.72769 POINT (139.72769 35.6093) 758 rows × 9 columns
というように
geometryが追加される
これでタイプを確認
type(gdf)
結果は
geopandas.geodataframe.GeoDataFrame
となって GeoDataflameになっているのが確認できる
これで
Csvファイルからジオメトリを作成し、それを元にGeoDataflameの作成ができた
さらに図で表示
gdf.plot()