2017-02-14 7 views
3

Когда я сохраняю dataframe как шейп-файл с геометрией, я получаю следующую ошибку.Сохранение данных в шейп-файл с использованием геоданных в python вызывает ValueError для bool

geometry = [Point(xy) for xy in zip(df.longitude, df.latitude)] 
dfout = geopandas.GeoDataFrame(df, geometry=geometry)  
dfout.to_file(outputpath, driver='ESRI Shapefile') 

Traceback (most recent call last): 
    File "test.py", line 230, in <module> 
    main() 
    File "test.py", line 223, in main 
    createSHP(df,outputpath) 
    File "test.py", line 150, in createSHP 
    dfout.to_file(outputpath, driver='ESRI Shapefile') 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/geopandas/geodataframe.py", line 343, in to_file 
    to_file(self, filename, driver, schema, **kwargs) 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/geopandas/io/file.py", line 61, in to_file 
    schema=schema, **kwargs) as c: 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/fiona/__init__.py", line 178, in open 
    enabled_drivers=enabled_drivers, crs_wkt=crs_wkt) 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/fiona/collection.py", line 155, in __init__ 
    self.session.start(self, **kwargs) 
    File "fiona/ogrext.pyx", line 961, in fiona.ogrext.WritingSession.start (fiona/ogrext.c:16015) 
ValueError: 'bool' is not in list 

Я не смог узнать, что означает эта ошибка.

+0

Какую версию python/geopandas/fiona вы используете? У вас есть какие-то пустые данные в вашем геометре? Я не могу воспроизвести вашу ошибку со случайными данными с плавающей запятой на Python 3.4, geometandas 0.2.1, fiona 1.7.1. –

+0

Можете ли вы показать вывод 'df.info()'? Можете ли вы проверить, есть ли у вас такая же ошибка при написании определенных подмножеств столбцов? – joris

+0

@joris фактически в некоторых столбцах присутствуют нулевые значения, которые не позволяют мне сохранять в csv. Поэтому я создал newdf с необходимыми столбцами, и он решил мою проблему. – user99

ответ

3

TL; DR: переделка колонны с DTYPE bool к int.


Эта ошибка возникает из-за того, что по дизайну, ESRI шейп не знает, что такое «логическое» тип данных. It just knows what integers are instead. То, что большинство людей в конечном итоге делают это просто изменить тип данных обратно в целое, т.е. True -> 1 и Ложное -> 0.

Чтобы узнать, какой столбец (ы) был присвоен bool типа данных, идти с:

geopandas.io.file.infer_schema(df) 

>>> {'geometry': 'Point', 
    'properties': OrderedDict([('integer', 'int'), 
           ('c', 'bool')]) 

Учитывая dataframe df с колонкой c типа bool, я бы:

df['c'] = df['c'].astype('int') 

Мы можем написать простую функцию, которая берет на себя все это для нас:

def gdf_bool_to_int(gdf): 
    """For a given GeoDataFrame, returns a copy that 
    recasts all `bool`-type columns as `int`. 

    GeoDataFrame -> GeoDataFrame""" 
    df = gdf.copy() 
    coltypes = gpd.io.file.infer_schema(df)['properties'] 
    for colname, coltype in coltypes.items(): 
     if coltype == 'bool': 
      df[colname] = df[colname].astype('int') 
    return df 

Вы также можете посмотреть на этот вопрос, как обсуждалось в geopandas repo on Github.

 Смежные вопросы

  • Нет связанных вопросов^_^