Python 使用folium从数据帧生成choropleth映射

Python 使用folium从数据帧生成choropleth映射,python,pandas,geojson,folium,choropleth,Python,Pandas,Geojson,Folium,Choropleth,我正在尝试使用熊猫来读取csv数据,制作一张choropleth地图。我在网上学习了一个教程,但没有让我的代码正常工作 教程链接:。以下是我正在尝试使用的代码: # CHOLOPLETH MAP import json kunnat_geo = r'kunnat.geojson' coords = pd.read_csv('taulu2.csv') map_cholo = folium.Map(location=[65,26], zoom_start=4, tiles='stamenwater

我正在尝试使用熊猫来读取csv数据,制作一张choropleth地图。我在网上学习了一个教程,但没有让我的代码正常工作

教程链接:。以下是我正在尝试使用的代码:

# CHOLOPLETH MAP
import json
kunnat_geo = r'kunnat.geojson'
coords = pd.read_csv('taulu2.csv')

map_cholo = folium.Map(location=[65,26], zoom_start=4, tiles='stamenwatercolor')
map_cholo.choropleth(
    geo_data=kunnat_geo,
    data=coords,
    columns=['ALUE', 'MIELENTERVEYDEN KUNTOUTUSKOTIEN ASIAKKAAT VUONNA 2018'],
    key_on='features.properties.Kunta',
    fill_color='YlGnBu', 
    fill_opacity=1, 
    line_opacity=1,
    legend_name='MIELENTERVEYDEN KUNTOUTUSKOTIEN ASIAKKAAT VUONNA 2018',
    smooth_factor=0)

map_cholo
但是,它给了我一个属性错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-74-026c8c7bfd66> in <module>
     14     line_opacity=1,
     15     legend_name='MIELENTERVEYDEN KUNTOUTUSKOTIEN ASIAKKAAT VUONNA 2018',
---> 16     smooth_factor=0)
     17 
     18 map_cholo

D:\Anaconda3\lib\site-packages\folium\folium.py in choropleth(self, *args, **kwargs)
    416         )
    417         from folium.features import Choropleth
--> 418         self.add_child(Choropleth(*args, **kwargs))
    419 
    420     def keep_in_front(self, *args):

D:\Anaconda3\lib\site-packages\folium\features.py in __init__(self, geo_data, data, columns, key_on, bins, fill_color, nan_fill_color, fill_opacity, nan_fill_opacity, line_color, line_weight, line_opacity, name, legend_name, overlay, control, show, topojson, smooth_factor, highlight, **kwargs)
   1249                 style_function=style_function,
   1250                 smooth_factor=smooth_factor,
-> 1251                 highlight_function=highlight_function if highlight else None)
   1252 
   1253         self.add_child(self.geojson)

D:\Anaconda3\lib\site-packages\folium\features.py in __init__(self, data, style_function, highlight_function, name, overlay, control, show, smooth_factor, tooltip, embed, popup)
    456             self.convert_to_feature_collection()
    457             if self.style:
--> 458                 self._validate_function(style_function, 'style_function')
    459                 self.style_function = style_function
    460                 self.style_map = {}

D:\Anaconda3\lib\site-packages\folium\features.py in _validate_function(self, func, name)
    521         """
    522         test_feature = self.data['features'][0]
--> 523         if not callable(func) or not isinstance(func(test_feature), dict):
    524             raise ValueError('{} should be a function that accepts items from '
    525                              'data[\'features\'] and returns a dictionary.'

D:\Anaconda3\lib\site-packages\folium\features.py in style_function(x)
   1223 
   1224         def style_function(x):
-> 1225             color, opacity = color_scale_fun(x)
   1226             return {
   1227                 'weight': line_weight,

D:\Anaconda3\lib\site-packages\folium\features.py in color_scale_fun(x)
   1204 
   1205             def color_scale_fun(x):
-> 1206                 key_of_x = get_by_key(x, key_on)
   1207                 if key_of_x is None:
   1208                     raise ValueError("key_on `{!r}` not found in GeoJSON.".format(key_on))

D:\Anaconda3\lib\site-packages\folium\features.py in get_by_key(obj, key)
   1201                 return (obj.get(key, None) if len(key.split('.')) <= 1 else
   1202                         get_by_key(obj.get(key.split('.')[0], None),
-> 1203                                    '.'.join(key.split('.')[1:])))
   1204 
   1205             def color_scale_fun(x):

D:\Anaconda3\lib\site-packages\folium\features.py in get_by_key(obj, key)
   1200             def get_by_key(obj, key):
   1201                 return (obj.get(key, None) if len(key.split('.')) <= 1 else
-> 1202                         get_by_key(obj.get(key.split('.')[0], None),
   1203                                    '.'.join(key.split('.')[1:])))
   1204 

AttributeError: 'NoneType' object has no attribute 'get'
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在里面
14线不透明度=1,
15 legend_name='MIELENTERVEYDEN KUNTOUTUSKOTIEN ASIAKKAAT VUONNA 2018',
--->16平滑系数=0)
17
18 map_cholo
D:\Anaconda3\lib\site packages\folium\folium.py in choropleth(self,*args,**kwargs)
416         )
417从folium.features导入Choropleth
-->418自我添加子项(Choropleth(*args,**kwargs))
419
420 def保持在前(自身,*参数):
D:\Anaconda3\lib\site packages\folium\features.py in\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(self、geo\u数据、数据、数据、列、键、空格、空格、空格、填充颜色、填充颜色、填充不透明度、不透明度、线条颜色、线条不透明度、线条权重、线条不透明度、名称、图例
1249 style_函数=style_函数,
1250平滑系数=平滑系数,
->1251 highlight_function=如果高亮显示,则高亮显示_function,否则无)
1252
1253 self.add_child(self.geojson)
D:\Anaconda3\lib\site packages\folium\features.py in\uuuuuuu init\uuuuuuuuuuuu(自我、数据、样式函数、突出显示函数、名称、覆盖、控件、显示、平滑因子、工具提示、嵌入、弹出)
456 self.convert_to_feature_collection()
457如果自我风格:
-->458自我验证功能(样式功能,“样式功能”)
459 self.style\u函数=style\u函数
460 self.style_map={}
D:\Anaconda3\lib\site packages\folium\features.py in\u validate\u函数(self、func、name)
521         """
522测试功能=自身数据['features'][0]
-->523如果不可调用(func)或不存在(func(测试功能),dict):
524 raise VALUERROR(“{}”应该是一个接受来自的项的函数”
525“数据[\'features\']并返回字典。”
D:\Anaconda3\lib\site packages\folium\features.py in style_函数(x)
1223
1224 def样式_功能(x):
->1225颜色,不透明度=颜色、比例和乐趣(x)
1226返回{
1227“重量”:线重量,
D:\Anaconda3\lib\site packages\folium\features.py彩色\u scale\u fun(x)
1204
1205 def颜色刻度(x):
->1206按x的键=按x键获取(x,按on键)
1207如果_x的键_为无:
1208 raise VALUERROR(“在GeoJSON中未找到`{!r}`上的键。”.format(上的键))
D:\Anaconda3\lib\site packages\folium\features.py在get_by_key(obj,key)中
1201如果len(key.split('.'))1203'.'返回(obj.get(key,None)。join(key.split('.')[1:]))
1204
1205 def颜色刻度(x):
D:\Anaconda3\lib\site packages\folium\features.py在get_by_key(obj,key)中
1200 def通过按键获取按键(obj,按键):
1201如果len(key.split('.'))返回(obj.get(key,None)1202按_键获取(obj.get(key.split('.'))[0],None),
1203'.'.join(key.split('..')[1:]))
1204
AttributeError:“非类型”对象没有属性“get”
以下是我使用的geojson文件:


数据:

您使用的geojson包含多个缺陷

{"id":49,"type":"Feature","geometry":{"coordinates":[[[[25.134789950981,65.0613390595066],[24.9509796014637,65.1411214235741],[24.1149334366251,65.1739425977789],[24.1374948169974,65.2416484128856],[24.6071512739822,65.211492673253],[25.2249108920834,65.2366422852267],[25.319454962569,65.2626286706296],[25.5524286749097,65.2529182323504],[25.6623616596278,65.260748036272],[25.7723806903971,65.2919894627541],[25.9132907485861,65.2931966157892],[26.0266782370841,65.2703735338041],[25.993210256336,65.1914324603082],[25.736352838218,65.2201254797071],[25.5637124399186,65.1919505955019],[25.635197316715,65.1390540421563],[25.6086182968484,65.0816350751541],[25.3775958184099,65.1070832092577],[25.2892903033333,65.0817828240486],[25.134789950981,65.0613390595066]]]],"type":"MultiPolygon"},"properties":{"nationalCode":84,"Country":"FI","name_fi":"Haukipudas","name_se":"Haukipudas"}}

属性中没有
Kunta
。这会导致geojson格式不正确。我建议您替换该geojson,或将其作为最后手段进行编辑。

使用
key\u on='feature.properties.Kunta'
。但是,geojson文件似乎有问题。正如您所看到的,我已经在使用'feature.properties.Kunta'。我不知道我认为geojson文件有什么问题,因为它本身就可以工作。我只是在将它实现到choropleth map.Nope时遇到了问题。您使用的是
key\u on='features.properties.Kunta'
。我已经用geojson文件的前三个ID创建了一个玩具geojson文件,我可以毫无问题地获得地图。我使用了
key_on='feature.properties.Kunta
,但它给了我
ValueError:key_on
'properties.Kunta'`在GeoJSON中找不到。正如我告诉过你的,GeoJSON有问题。你在哪里找到的GeoJSON文件?看起来与我的不同。你在原始问题中提供了该文件:这是我使用的GeoJSON文件:哦,是的,我的错,似乎一些“Kunta”属性有一些额外的变量“name_fi”和“name_se”,因为一些芬兰城市也有瑞典名字。我用“Kunta”替换了所有的“name_fi”但它没有做任何事情。我还打印了GejJSON文件,没有数据,它看起来很好。正如我告诉你的,文件中有多个缺陷。没有任何更新,我认为回答的问题。