Создайте столбец в GeoDataFrame и запишите в него новое значение - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь добавить столбец в шейп-файл, считанный как GeoDataFrame, и заполнить этот столбец простым числом, полученным из набора точечных данных.Когда я делаю это, колонка заполняется NaN, что наводит меня на мысль, что это серия, на которую нужно ссылаться с помощью iloc, а не на скаляр.

polys["conflict"] = None
for index, row in polys.iterrows():
    polygon = polys.geometry[0]
    subset = conflict[conflict.within(polygon)]
    scalar = subset.iloc[0]
    polys = polys.assign(conflict=subset)

polys - это gdf (полигоны).конфликт - это точечный набор данных, который также считывается в формате gdf.

Также попытался:

polys.conflict.iloc[0] = subset

Получение ошибки «Несовместимый индексатор с DataFrame»

1 Ответ

0 голосов
/ 06 июля 2019

Я пытался следовать вашему коду, и если я не ошибаюсь, вы можете добиться того, что вы намереваетесь сделать, внеся некоторые небольшие изменения:

polys["conflict"] = None
for index, row in polys.iterrows():
    polygon = row.geometry
    subset = conflict[conflict.within(polygon)].shape[0] # gets the count of conflict points inside the polygon
    row['conflict'] = subset

Еще один более эффективный способ сделать то, что вы хотите сделать, это использовать пространственный индекс, предоставленный в geopandas 'GeoDataFrame (полное объяснение этого доступно здесь ):

polys["conflict"] = None

conflict_sindex = conflict.sindex
for index, row in polys.iterrows():
    possible_matches_index = list(conflict_sindex.intersection(row.geometry.bounds))
    possible_matches = conflict.iloc[possible_matches_index]
    precise_matches = possible_matches[possible_matches.intersects(row.geometry)]
    if not precise_matches.empty:
        res = precise_matches.shape[0] # gets the count of conflict points inside the polygon
        row['conflict'] = res
...