What I'm trying to achieve:

  • Read in an existing ESRI polygon shapefile
  • Drop an attribute
  • Dissolve by another attribute
  • Rename columns
  • Reorder columns
  • Write out as new shapefile

What works: Drop column and dissolve all work - I've run these steps and written to file. This opens fine in ArcMap, I can identify things, open the attribute table etc. No issues.

Problem: When I rename (not got to the reorder step without error yet) the columns, everything runs fine and I write to file. When then opening the shapefile in ArcMap (10.3.1) I can query layers using the Identify cursor which shows my renamed attributes as they should be BUT when trying to open the attribute table, I get the following message in a window:

Loading table data

Could not load data from the data source. If you can correct the problem, press the refresh button to reload data. Possible problems can include bad network connection, invalid file, etc.

A column was specified that doesn't exists.

A column was specified that doesn't exists.

So, it looks like something is missing or my changes are not being mapped across the shapefile components.

Given a mock version of the data:

# Make a mock geopandas dataframe
import geopandas as gpd
from shapely.geometry import Point, Polygon
from fiona.crs import from_epsg

data = gpd.GeoDataFrame()

# Coordinates of some locations in British National Grid (epsg: 27700)
coordinates1 = [(19.950899, 60.169158), (20.953492, 60.169158), (20.950958, 61.169990), (19.953510, 61.170104)]
coordinates2 = [(21.950899, 60.169158), (22.953492, 60.169158), (22.950958, 61.169990), (21.953510, 61.170104)]
coordinates3 = [(19.99, 60.3), (20.23492, 60.3), (20.23492, 60.8), (19.99, 60.8)]

# Create a Shapely polygon from the coordinate-tuple list
poly1 = Polygon(coordinates1)
poly2 = Polygon(coordinates2)
poly3 = Polygon(coordinates3) # (sits inside polygon 1)

# Add polygon to dataframe
data.loc[0, 'geometry'] = poly1
data.loc[1, 'geometry'] = poly2
data.loc[2, 'geometry'] = poly3
data.loc[0, 'value'] = 1
data.loc[1, 'value'] = 2
data.loc[2, 'value'] = 3
data.loc[0, 'CLASS'] = 'A'
data.loc[1, 'CLASS'] = 'B'
data.loc[2, 'CLASS'] = 'A'
data.loc[0, 'Hazard_Pot'] = 'High'
data.loc[1, 'Hazard_Pot'] = 'Low'
data.loc[2, 'Hazard_Pot'] = 'High'

# Define CRS
data.crs = from_epsg(27700)

## Plot it
#import matplotlib.pyplot as plt
#data.loc[[2],'geometry'].plot(ax=ax1, color='red') # plot on top of others

We'll now dissolve the polygons based on Hazard_Pot and then rename and reorder things. The problem is with the renaming... What am I missing?

# Drop a column (if writing out file here, does as expected)
data=data.drop(['CLASS'], axis=1)

# Do the dissolve (if writing out file here, does as expected)
data=data.dissolve(by='Hazard_Pot', as_index=False)

# Rename <<< won't work in ArcGIS 
data=data.rename(index=str, columns={"Hazard_Pot":"Potential",
                        "contaminat":"Contam."}) # <<< EDIT: notice the punctuation (noticed following the accepted answer)

# Reorder 

# write to file (creating a new CRS based on the old as per https://gis.stackexchange.com/questions/204201/geopandas-to-file-saves-geodataframe-without-coordinate-system?noredirect=1&lq=1)
data.to_file(ofile, driver='ESRI Shapefile')
  • data.rename(index=str... renaming the index to a data type is very strange. Take that part out and report back – Paul H Mar 27 at 15:45
  • I can't share the data but can share the code and you can share fake data that reproduces the issue – Paul H Mar 27 at 15:46
  • @PaulH i belive index=str is correct syntax, see the examples in help section of rename. But I also think that part is not needed. – BERA Mar 27 at 16:10
  • @BERA Oops - forgot rename could take callables. – Paul H Mar 27 at 16:38

Looking at your code I can see two things that Arcmap doesn't like:

  • The first one is the space in the field name "building d";
  • The second one - and the cause of the error - is the . in "contaminat":"Contam.".

I was able to reproduce the error by creating a test file and using your code. Removing the dot "contaminat":"Contam" solved the problem.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.