Преобразование фрейма геоданных geopandas в фрейм данных pandas

Каков наиболее эффективный способ преобразовать фрейм геоданных 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] )
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
25
0
17 896
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

Два примечания:

  • Часто нет необходимости преобразовывать GeoDataFrame в обычный DataFrame, потому что большинство методов, которые вы знаете из DataFrame, также будут работать. Конечно, есть несколько случаев, когда это действительно необходимо (например, для построения данных без геометрии), и тогда описанный выше метод - лучший способ.
  • Первый способ (df1 = pd.DataFrame(gdf)) не будет копировать данные в GeoDataFrame. Часто это будет хорошо с точки зрения эффективности, но в зависимости от того, что вы хотите делать с DataFrame, вам может понадобиться фактическая копия: df1 = pd.DataFrame(gdf, copy=True)

Спасибо, это очень помогло. Примечание - gdf.drop(columns='geometry') с ключевым словом columns работает только с версии pandas 0.21, которая является относительно недавней. Это не работает для меня и может не работать для других.

jberrio 27.03.2018 09:23

Да, это правда. Альтернатива - gdf.drop('geometry', axis=1), добавлю.

joris 27.03.2018 09:43

Одно важное замечание (применимо, по крайней мере, для pandas 1.0.5): если вы создаете новый фрейм данных только с помощью pd.DataFrame (geopandas_df), не гарантируется, что серия в новом pandas df не будет geopandas.array. Это может вызвать несколько ошибок, связанных с невыполнением метода при вызове методов pandas.

Иван Судос 28.11.2020 23:43

@ ИванСудос Означает ли это, что преобразование фрейма геоданных в массив numpy - самый безопасный способ сделать преобразование (например, используя код в исходном вопросе)? Или вы можете предложить лучшую альтернативу?

jberrio 19.05.2021 02:18

@jberrio ну, я в основном решаю это с помощью структурирования кода, чтобы я избегал нетривиальных операций pandas с геопандами и считаю, что это лучший способ. Но в случае, если это действительно необходимо, я согласен с вами и предлагаю метод .to_numpy (), поскольку он ничего не копирует, если не указано копирование параметра.

Иван Судос 19.05.2021 20:00

Другие вопросы по теме