python - ValueError:使用 geopandas 数据框时无法渲染具有任何缺失几何形状的对象
问题描述
我正在尝试使用我通过将包含巴西所有区域的 shapefile(名为“map_1”)与常规 pandas 数据框(名为“amazon_state”)合并而构建的 geopandas 数据框在 folium 地图上添加 choropleth 层。两个数据帧的合并给了我“map_2”,在清理(删除一些行)之后,我称之为“map_3”。
'''
#importing shapefile map_1, which contains all regions in Brazil
map_1= gpd.read_file("/Users/alexandertankou/Desktop/python/bra_adm1/BRA_adm1.shp")
# creating amazon_state
amazon_state= amazon_data.groupby("state", as_index=False).sum().drop(columns=["year"])
# ensure the naming of regions e in map_1 and amazon_state is the same
map_1.NAME_1= amazon_state.state
#map_2: merging map_1 with amazon_state
map_2= pd.merge (left=map_1, right= amazon_state, left_on="NAME_1", right_on="state", how= "left")
#dropping none useful columns
map_2= map_2.drop(columns=["NAME_0",'HASC_1',"ID_1","ISO","CCN_1","CCA_1","ID_0","TYPE_1","ENGTYPE_1", "NL_NAME_1","VARNAME_1"])
#ploting map_2
map_2.plot(column="number", cmap="YlOrRd",legend=True, figsize= (13,10))
#setting the folium map
m=folium.Map(location= [-22.919882,-43.604392], zoom_start=10)
#making geomery type hashable in python
map_2['geometry'] = map_2['geometry'].apply(lambda x: str(x))
#cleaning up map_2 data
map_3= map_2.iloc[0:23,:]
#add the choropleth layer on folium map
m.choropleth(geo_data= map_3,name="geometry", data= map_3,key_on="feature.properties.NAME_1",columns=["geometry","number"],fill_color='YlGn')
folium.LayerControl().add_to(m)
'''
但我不断收到ValueError: Cannot render objects with any missing geometry。使用过 isnan 和 is_empty 方法后,我确定 map_3 中没有缺失值(请参阅下面的数据),所以不确定我做错了什么:
NAME_1 geometry \
0 Acre POLYGON ((-73.33251190185541 -7.32487916946411...
1 Alagoas MULTIPOLYGON (((-35.90152740478516 -9.86180496...
2 Amapa MULTIPOLYGON (((-50.02402877807612 0.859862029...
3 Amazonas POLYGON ((-67.32623291015625 2.029680967331046...
4 Bahia MULTIPOLYGON (((-38.69708251953125 -17.9790287...
5 Ceara MULTIPOLYGON (((-38.47541809082026 -3.70097303...
6 Distrito Federal POLYGON ((-48.03603363037109 -15.5002202987670...
7 Espirito Santo MULTIPOLYGON (((-40.88402938842768 -21.1612491...
8 Goias POLYGON ((-50.15817260742188 -12.4123792648315...
9 Maranhao MULTIPOLYGON (((-42.12374877929688 -2.80069398...
10 Mato Grosso POLYGON ((-56.1036376953125 -17.17354011535639...
11 Minas Gerais POLYGON ((-57.6052360534668 -8.662846565246525...
12 Paraiba POLYGON ((-44.20977783203119 -14.2366542816162...
13 Par· MULTIPOLYGON (((-46.43458175659174 -1.01708304...
14 Pernambuco MULTIPOLYGON (((-42.87873840332026 -9.29837322...
15 Piau MULTIPOLYGON (((-48.63069534301758 -25.8679161...
16 Rio MULTIPOLYGON (((-35.13597106933594 -8.83791732...
17 Rondonia POLYGON ((-41.81680679321283 -2.74375009536743...
18 Roraima MULTIPOLYGON (((-44.67124938964838 -23.3545837...
19 Santa Catarina MULTIPOLYGON (((-35.10902786254883 -6.19347190...
20 Sao Paulo MULTIPOLYGON (((-52.07069396972656 -32.0284729...
21 Sergipe POLYGON ((-63.53470230102539 -7.97433900833129...
22 Tocantins POLYGON ((-60.16886138916004 5.226301193237362...
state number
0 Acre 18464.030
1 Alagoas 4644.000
2 Amapa 21831.576
3 Amazonas 30650.129
4 Bahia 44746.226
5 Ceara 30428.063
6 Distrito Federal 3561.000
7 Espirito Santo 6546.000
8 Goias 37695.520
9 Maranhao 25129.131
10 Mato Grosso 96246.028
11 Minas Gerais 37475.258
12 Paraiba 52435.918
13 Par· 24512.144
14 Pernambuco 24498.000
15 Piau 37803.747
16 Rio 45160.865
17 Rondonia 20285.429
18 Roraima 24385.074
19 Santa Catarina 24359.852
20 Sao Paulo 51121.198
21 Sergipe 3237.000
22 Tocantins 33707.885
解决方案
@Thomas 是对的:您的问题是您的map_2
和map_3
变量对应于<class 'pandas.core.frame.DataFrame'>
,但您需要<class 'geopandas.geodataframe.GeoDataFrame'>
.
原因在这里:
map_2 = pd.merge(left=map_1, right=amazon_state, left_on="NAME_1",
right_on="state", how= "left")
当您调用pandas.merge()
方法并且您的参数是GeoDataFrame
并且DataFrame
结果将始终是DataFrame
.
如果你想GeoDataFrame
在合并后得到使用pandas.DataFrame.merge()
方法。确保从GeoDataFrame
,调用它not DataFrame
:
map_2 = map_1.merge(right=amazon_state, left_on="NAME_1",
right_on="state", how="left")
您还可以查看geopandas 的相关文档。
推荐阅读
- python - 连接到子图网络的节点或节点集x
- python-3.x - PyTrends 不断返回带有错误代码 400 的 Google 响应
- c++ - 关闭控制台时阻止应用程序关闭
- python - 如何从熊猫 df 中过滤少于 15 个条目的月份?
- r - 用其他数据框中的数据填充 R 中的 NA 值
- mysql - Intellij MYSQl 如何与控制器类连接?
- ios - 传递数据时,如何使变量可被多个类识别?
- android - lateinit 属性尚未初始化我找不到初始化它的方法
- asp.net-mvc - 将列表从控制器传递到视图 MVC
- javascript - 无法将 Dialogflow 响应解析为 AppResponse