Каков наиболее эффективный способ преобразовать фрейм геоданных geopandas в фрейм данных pandas? Ниже приведен метод, который я использую, есть ли другой метод, который более эффективен или лучше в целом не генерирует ошибок?
import geopandas as gpd
import pandas as pd
# assuming I have a shapefile named shp1.shp
gdf1 = gpd.read_file('shp1.shp')
# then for the conversion, I drop the last column (geometry) and specify the column names for the new df
df1 = pd.DataFrame(gdf1.iloc[:,:-1].values, columns = list(gdf1.columns.values)[:-1] )






Вам не нужно преобразовывать GeoDataFrame в массив значений, вы можете передать его прямо в конструктор DataFrame:
df1 = pd.DataFrame(gdf)
Вышеупомянутое будет содержать столбец «геометрия», что не проблема для его обычного DataFrame. Но если вы действительно хотите удалить этот столбец, вы можете сделать (при условии, что столбец называется «геометрия»):
df1 = pd.DataFrame(gdf.drop(columns='geometry'))
# for older versions of pandas (< 0.21), the drop part: gdf.drop('geometry', axis=1)
Два примечания:
df1 = pd.DataFrame(gdf)) не будет копировать данные в GeoDataFrame. Часто это будет хорошо с точки зрения эффективности, но в зависимости от того, что вы хотите делать с DataFrame, вам может понадобиться фактическая копия: df1 = pd.DataFrame(gdf, copy=True)Да, это правда. Альтернатива - gdf.drop('geometry', axis=1), добавлю.
Одно важное замечание (применимо, по крайней мере, для pandas 1.0.5): если вы создаете новый фрейм данных только с помощью pd.DataFrame (geopandas_df), не гарантируется, что серия в новом pandas df не будет geopandas.array. Это может вызвать несколько ошибок, связанных с невыполнением метода при вызове методов pandas.
@ ИванСудос Означает ли это, что преобразование фрейма геоданных в массив numpy - самый безопасный способ сделать преобразование (например, используя код в исходном вопросе)? Или вы можете предложить лучшую альтернативу?
@jberrio ну, я в основном решаю это с помощью структурирования кода, чтобы я избегал нетривиальных операций pandas с геопандами и считаю, что это лучший способ. Но в случае, если это действительно необходимо, я согласен с вами и предлагаю метод .to_numpy (), поскольку он ничего не копирует, если не указано копирование параметра.
Спасибо, это очень помогло. Примечание -
gdf.drop(columns='geometry')с ключевым словомcolumnsработает только с версии pandas 0.21, которая является относительно недавней. Это не работает для меня и может не работать для других.