
geodataframe是pandas dataframe的扩展,专门用于处理地理空间数据。在索引和选择数据方面,geodataframe的行为与pandas dataframe完全一致。然而,许多用户在对数据进行过滤操作后,尝试通过原始索引访问数据时会遇到困惑。
问题根源:过滤操作后的索引保留
当我们从一个GeoDataFrame(或DataFrame)中根据条件筛选出子集时,新生成的子集GeoDataFrame会默认保留原始GeoDataFrame的索引。这意味着,如果原始GeoDataFrame的索引不是从0开始连续的,或者在过滤后某些索引被跳过,那么新子集的索引也将是不连续的。
考虑以下GeoPandas示例:
import geopandas as gpd
# 加载世界地图数据
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
# 筛选出法国和比利时
BeFra = world.loc[world['name'].isin(['France', 'Belgium'])]
# 打印筛选后的GeoDataFrame,观察其索引
print(BeFra)运行上述代码,你可能会看到类似以下的输出:
pop_est continent ... gdp_md_est geometry 43 67059887.0 Europe ... 2715518 MULTIPOLYGON (((-51.65780 4.15623, -52.24934 3... 129 11484055.0 Europe ... 533097 POLYGON ((6.15666 50.80372, 6.04307 50.12805, ...
从输出中可以看出,BeFra GeoDataFrame只包含两行数据,它们的索引分别是43和129。原始的索引0、1、2等已经不存在于BeFra中。因此,如果此时尝试使用 BeFra['geometry'][0] 来访问第一个几何对象,系统会因为找不到索引0而抛出KeyError。
相比之下,如果直接创建一个新的Pandas DataFrame,其默认索引就是从0开始连续的:
import pandas as pd data = [['tom', 10], ['nick', 15], ['juli', 14]] df = pd.DataFrame(data, columns=['Name', 'Age']) print(df) print(df['Name'][0]) # 此时可以成功访问,因为索引0存在
这个例子成功的原因在于df的索引是0, 1, 2,所以df['Name'][0]是有效的。
解决上述问题的关键在于理解Pandas(以及GeoPandas)提供了两种主要的索引方式:
在数据经过过滤导致索引不连续的情况下,.iloc是访问特定位置元素的理想选择。要选择BeFra GeoDataFrame中的第一个几何对象,无论其原始索引是什么,我们都可以使用iloc[0]来获取第一行,然后选择'geometry'列:
import geopandas as gpd
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
BeFra = world.loc[world['name'].isin(['France', 'Belgium'])]
# 使用 .iloc[0] 获取第一行,然后选择 'geometry' 列
first_geometry = BeFra.iloc[0]['geometry']
print(f"成功选择的第一个几何对象类型: {first_geometry.geom_type}")
# 打印几何对象的WKT表示(截取前50字符)
print(f"其WKT表示的前50字符: {str(first_geometry.wkt)[:50]}...")BeFra.iloc[0]会返回一个Series对象,代表BeFra中的第一行数据。然后,你可以像访问字典一样通过列名(例如'geometry')来获取该行的特定列值。
# 示例:重置索引以获得连续的0-based索引
BeFra_reset = BeFra.reset_index(drop=True)
print(BeFra_reset)
# 此时,BeFra_reset['geometry'][0] 将会正常工作
print(f"重置索引后,通过索引0获取的几何对象类型: {BeFra_reset['geometry'][0].geom_type}")使用drop=True参数可以避免将旧索引添加为一个新的列。
GeoDataFrame在索引行为上与Pandas DataFrame保持一致,因此理解Pandas的索引机制对于高效操作GeoDataFrame至关重要。在对GeoDataFrame进行过滤操作后,由于原始索引的保留,直接通过非连续的索引值访问数据会失败。通过掌握.iloc进行基于位置的选择,或者在必要时使用reset_index(drop=True)来重置索引,可以有效解决这一问题。选择合适的索引方法,将使你在处理地理空间数据时更加游刃有余。
以上就是如何在GeoDataFrame中高效选择单个值:理解索引与位置的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号