#python #pandas #dataframe #shapefile #geopandas
Вопрос:
Я новичок в использовании как файлов фигур, так и фреймов данных geopandas. Я читаю существующий файл формы в фрейм данных, добавляю два столбца в фрейм данных и записываю новый фрейм данных в файл формы.
Вот код, который я использую для чтения данных. Все загружаемые файлы можно получить в этом zip-файле
import pandas
import geopandas as gpd
import fiona
import numpy as np
#Reading in the existing shape file
df = gpd.read_file("TX_vtds_extra/TX_vtds_extra.shp")
#Read the scheme for the shape file
with fiona.open("TX_vtds_extra/TX_vtds_extra.shp") as f:
input_schema = f.schema
#Read in data to append to dataframe and change column names
new_data = pandas.read_csv('2020_General_Election_VRTO.csv')
Gen_Elec_20_VRTO.rename(columns={'TotalTO':'TOTTO20','TotalVR':'TOTVR20'},inplace=True)
Вот код, который я использую для добавления новых данных в исходный кадр данных. Код немного неудобен, потому что я надеюсь в конечном итоге преобразовать код в функцию.
#This will eventually be the input to the function
B=new_data
A=df
col_list = ['TOTVR20', 'TOTTO20']
list_len = len(col_list)
#Add new columns to dataframe
for col in col_list:
A[col]=""
#Rearange columns so that geometry is last column in list
col = list(range(len(A.columns)-(list_len 1)))
col = col list(range(len(A.columns)-list_len,len(A.columns)))
col.append(len(A.columns)-(list_len 1))
A=A[A.columns[col]]
#Map new info into existing dataframe using the 'CNTYVTD' identifiers
for index, row in A.iterrows():
mask = B['CNTYVTD']==row['CNTYVTD']
if any(mask):
temp = B[mask]
for col in col_list:
A.loc[index,col]=temp.iloc[0][col]
else:
for col in col_list:
A.loc[index,col]=0
Наконец, код, используемый для записи нового фрейма данных в файл формы
output_schema = input_schema
output_schema['properties']['TOTVR20'] = 'int:18'
output_schema['properties']['TOTTO20'] = 'int:18'
A.to_file("TX_vtds_extra_extra/TX_vtds_extra_extra.shp", schema=output_schema)
В этой последней строке кода я получаю сообщение об ошибке
Ошибка значения: Недопустимый тип поля <класс ‘numpy.int64’>
Недопустимый тип поля, по-видимому, содержится в новых столбцах, которые я добавил, потому что, если я напишу новый фрейм данных с удаленными новыми столбцами, используя ту же функцию, все будет работать гладко.
Комментарии:
1. Я не могу воспроизвести эту ошибку. Какие версии
fiona
иgeopandas
вы используете?