CSVファイルの読み込みとgeopandas

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()

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です