在 GeoDataFrames 上使用 Pandas' apply() 函数

Use Pandas' apply() function on GeoDataFrames

我正在尝试做一件非常简单的事情。我有一个带有属性列(gdf.att)和几何列(gdf.geometry,所有的几何形状都是匀称的点)。

现在我想创建一个额外的列,其值是点坐标和属性的函数结果。我正在尝试使用 apply() 执行此操作,如下所示:

gdf['new_col'] = gdf.apply(lambda row : function([row.geometry.x, row.geometry.y], row.att))

但是,我收到以下错误:

AttributeError: 'Series' object has no attribute 'geometry'

似乎在apply函数中,row是一个我不能称为几何的系列。但我不明白这一点,因为如果我 运行 下面的测试来检查我得到了什么,如果我只是 return row,那么我得到一个 GeoDataFrame 作为输出.

test = gdf.apply(lambda row: row) # after running this, test is the same as gdf

有人知道如何将 apply() 与使用多列的 GDF 一起使用吗?

谢谢!

import geopandas as gpd

gdf = gpd.read_file(gpd.datasets.get_path('naturalearth_cities')).rename(columns={"name":"att"})

def function(point, att):
    return att[int(point[0] % len(att))]

gdf['new_col'] = gdf.apply(lambda row : function([row.geometry.x, row.geometry.y], row.att), axis=1)

gdf.head(5)
att geometry new_col
0 Vatican City POINT (12.453386544971766 41.903282179960115) V
1 San Marino POINT (12.441770157800141 43.936095834768004) n
2 Vaduz POINT (9.516669472907267 47.13372377429357) z
3 Luxembourg POINT (6.130002806227083 49.611660379121076) o
4 Palikir POINT (158.1499743237623 6.916643696007725) k