将 csv 和 shapefile 与 geopandas 合并
Merge a csv and shapefile with geopandas
我正在尝试使用 geopandas 将 CSV 与 shapefile 合并。我对两者都有一个唯一 ID,并且希望在存在匹配的唯一 ID 时将 CSV 中的数据附加到 shapefile 中。谢谢
- 这是一个完整的工作示例
- 加载下载的美国各州形状文件
- 加载 CSV(使用
io.StringIO
使此代码独立)
- pandas
merge()
在关键列 iso_3166_2
- 通过绘制合并数据、形状文件中的几何图形、来自 CSV
的 size 来显示它的工作原理
import io
import geopandas as gpd
import pandas as pd
from pathlib import Path
from zipfile import ZipFile
import urllib
import requests
# fmt: off
# download boundaries
url = "https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_1_states_provinces.zip"
f = Path.cwd().joinpath(urllib.parse.urlparse(url).path.split("/")[-1])
# fmt: on
if not f.exists():
r = requests.get(url, stream=True, headers={"User-Agent": "XY"})
with open(f, "wb") as fd:
for chunk in r.iter_content(chunk_size=128):
fd.write(chunk)
zfile = ZipFile(f)
zfile.extractall(f.stem)
# load downloaded boundaries (shape file)
gdf2 = gpd.read_file(str(f.parent.joinpath(f.stem).joinpath(f"{f.stem}.shp")))
# load CSV....
df = pd.read_csv(io.StringIO("""size,iso_3166_2
118,US-MN
829,US-MT
235,US-ND
998,US-ID
807,US-WA
956,US-AZ
2094,US-CA
652,US-CO
541,US-NV
1,US-WV
3,US-MD
2,US-NJ
8,US-NY
16,US-PA
1,US-ME
66,US-MI"""))
gdf = gpd.GeoDataFrame(df.merge(gdf2, on="iso_3166_2"))
# prove it worked...
gdf.plot(column="size", cmap="OrRd")
我正在尝试使用 geopandas 将 CSV 与 shapefile 合并。我对两者都有一个唯一 ID,并且希望在存在匹配的唯一 ID 时将 CSV 中的数据附加到 shapefile 中。谢谢
- 这是一个完整的工作示例
- 加载下载的美国各州形状文件
- 加载 CSV(使用
io.StringIO
使此代码独立) - pandas
merge()
在关键列 iso_3166_2 - 通过绘制合并数据、形状文件中的几何图形、来自 CSV 的 size 来显示它的工作原理
import io
import geopandas as gpd
import pandas as pd
from pathlib import Path
from zipfile import ZipFile
import urllib
import requests
# fmt: off
# download boundaries
url = "https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_1_states_provinces.zip"
f = Path.cwd().joinpath(urllib.parse.urlparse(url).path.split("/")[-1])
# fmt: on
if not f.exists():
r = requests.get(url, stream=True, headers={"User-Agent": "XY"})
with open(f, "wb") as fd:
for chunk in r.iter_content(chunk_size=128):
fd.write(chunk)
zfile = ZipFile(f)
zfile.extractall(f.stem)
# load downloaded boundaries (shape file)
gdf2 = gpd.read_file(str(f.parent.joinpath(f.stem).joinpath(f"{f.stem}.shp")))
# load CSV....
df = pd.read_csv(io.StringIO("""size,iso_3166_2
118,US-MN
829,US-MT
235,US-ND
998,US-ID
807,US-WA
956,US-AZ
2094,US-CA
652,US-CO
541,US-NV
1,US-WV
3,US-MD
2,US-NJ
8,US-NY
16,US-PA
1,US-ME
66,US-MI"""))
gdf = gpd.GeoDataFrame(df.merge(gdf2, on="iso_3166_2"))
# prove it worked...
gdf.plot(column="size", cmap="OrRd")