将 geopandas 的地理数据框转换为 pandas 数据框

42

如何最有效地将geopandas geodataframe转换为pandas dataframe?以下是我使用的方法,是否有其他更有效或更好的方法可以避免生成错误呢?

什么是将geopandas geodataframe转换为pandas dataframe的最有效方法?以下是我使用的方法,是否有其他方法更有效或更好地避免产生错误?

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] )
1个回答

67
您无需将GeoDataFrame转换为值数组,可以直接将其传递到DataFrame构造函数中:
df1 = pd.DataFrame(gdf)

以上代码会保留名为“geometry”的列,如果你想要删除该列,可以执行以下操作:

(假设该列的名称为“geometry”)

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)

2
谢谢,这非常有帮助。需要注意的是,gdf.drop(columns='geometry') 中的 columns 关键字只适用于较新的 pandas 版本0.21及以上。对我来说它不起作用,对其他人也可能不起作用。 - jberrio
3
是的,没错。另一种方法是 gdf.drop('geometry', axis=1),我会加上这个。 - joris
3
一个重要的注意事项(适用于至少pandas 1.0.5):如果您只使用pd.DataFrame(geopandas_df)构建新的数据框架,则不能保证新的pandas df中的系列不会是geopandas.array。这可能会在调用pandas方法时导致多个未实现的方法错误。 - Ivan Sudos
@ИванСудос 这是否意味着将geodataframe转换为numpy数组是进行转换的最安全方法(例如使用原始问题中的代码)?还是您可以建议更好的替代方案? - jberrio
1
@jberrio 好的,我通常会通过构建代码结构来避免在 geopandas 上进行非平凡的 pandas 操作,并且认为这是最好的方法。但在确实需要时,我同意你的建议,并建议使用 .to_numpy() 方法,因为它只有在指定参数 copy 时才会复制任何东西。 - Ivan Sudos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接