使用 lambda 函数循环的 geopandas

geopandas looping with lambda function

我有一个 geojson 文档 'streets',其中的“几何”列填充了 shapely Point 类型的数据。 我有另一个 geojson 文档 'quartiers',其中有一列“几何”,其数据类型为 shapely Polygon,在同一文档中我还有另一列名为“l_qu”。 我想要实现的是在四分之一 ['geometry'] 中使用 lambda 遍历所有街道 ['geometry] 并在 [=] 中的新列 'matchquartier' 中分配相应的 'l_qu' 匹配值25=]。 街道(地址)有 150K 条线路,街区(街区)有 80 条线路 我构建的 lambda 是:

def checkquartier(point):
    return quartiers[quartiers["geometry"].apply(point.within)]["l_qu"]      

当 运行 对 lambda 进行一些测试时,说: checkquartier(streets['geometry'][19]) ,没问题,它 returns:

19 拉夏贝尔 名称:l_qu,数据类型:对象

这是预期的结果。问题是当我尝试用

为我的整个文档做这件事时
streets["matchquartier"]=streets['geometry'].apply(lambda x: checkquartier(x))

它returns错误: ValueError:通过 80 的项目数量错误,放置意味着 1

我知道这是一个更广泛的 pandas 问题,但我在 SO 上发现的另一个 fixes/answers 在这种情况下不起作用,所以想知道 GeoPandas 方面是否有我做错的事情?谢谢


import pandas as pd
import geopandas
import os
import shapely
from shapely.geometry import Polygon, LineString, Point,box
import matplotlib.pyplot as plt
from shapely import wkt

quartiers = geopandas.read_file("https://parisdata.opendatasoft.com/explore/dataset/quartier_paris/download/?format=geojson&timezone=Europe/Berlin&lang=fr")
streets=geopandas.read_file("https://opendata.paris.fr/explore/dataset/adresse_paris/download/?format=geojson&timezone=Europe/Berlin&lang=fr")

def checkquartier(point):
    return quartiers[quartiers["geometry"].apply(point.within)]["l_qu"]   

streets["matchquartier"]=streets['geometry'].apply(lambda x: checkquartier(x))

IIUC,你可以只使用空间连接。这对我有用。

import os
import pandas as pd
import geopandas as gpd
import shapely
from shapely import wkt
from shapely.geometry import Polygon, LineString, Point, box, shape
import json

quartiers = gpd.read_file("quartier_paris.csv")
streets=gpd.read_file("adresse_paris.csv")

quartiers["geometry"] = quartiers["geom"].apply(lambda x: shape(json.loads(x)))

streets["geometry"] = streets["geom"].apply(lambda x: shape(json.loads(x)))

sj = gpd.sjoin(streets, quartiers)
streets.join(sj["l_qu"])