Python перебирает CSV и выполняет точку в операции многоугольника

Моя цель состоит в том, чтобы перебрать кадр данных из файла CSV, выполнить точку в операции многоугольника и назначить ее новому столбцу в кадре данных. Я был в состоянии построить функцию, и моя единственная проблема заключается в том, как выполнить итерацию по фрейму данных и добавить результаты этой функции.

from shapely.geometry import Point, shape
point = Point(10.2023019,8.43254802)
fc = fiona.open("ngaadmbndaadm2osgof20170222.geojson")
print (fc.schema)

а затем выведите значение для значений из точки:

for feature in fc:
    if shape(feature['geometry']).contains(point):
                df_data['Admin2name'] = (feature['properties']['admin2Name'])

Мой фрейм данных выглядит так

введите описание изображения здесь

3 ответа

Обычно неэффективно выполнять итерации по фрейму данных. Вместо этого вы можете захотеть прочитать ваш CSV-файл в другой фрейм данных и объединить его с вашим текущим фреймом данных в столбцах координат X&Y.

Я нашел решение с помощью другого метода, выполняющего пространственное объединение (слияние) на двух геоданных

merged_gdf = gpd.sjoin(gdf, df_lga, how="inner", op="within")

Для тех, кто будет иметь эту проблему полный код ниже

import pandas as pd 
import geopandas as gpd 
df_lga = gpd.read_file('ngaadmbndaadm2osgof20170222.geojson') #first df
df_data = pd.read_csv('nigeria_healthfacilities.csv', low_memory=False)# second df

geometry = [Point(xy) for xy in zip(df_data.X, df_data.Y)] # transpose lat, long to shapely geomentry point 
crs = {'init': 'epsg:4326'} #set crs
gdf = GeoDataFrame(df, crs=crs, geometry=geometry)

merged_gdf = gpd.sjoin(gdf, df_lga, how="inner", op="within")# merge two df into one that spatialy joins points in polygons 
merged_gdf

Насколько я могу судить, ваш вопрос не очень понятен, но я предполагаю, что вы спрашиваете, как создать новый столбец как функцию предыдущих столбцов? Вы почти никогда не захотите перебирать все столбцы, но если Датафрейм достаточно мал, это, конечно, не имеет значения.

Вы можете использовать векторизацию, если это возможно:

df = pd.DataFrame({'A' : [1,2,3,4,5,6], 'B': [6,5,4,3,2,1]})
df
>>>     A   B
    0   1   6
    1   2   5
    2   3   4
    3   4   3
    4   5   2
    5   6   1

Теперь вы можете просто определить новый столбец непосредственно из A и B:

df['C'] = (df['A']*df['B'] >= 8)
df
>>>     A   B   C
    0   1   6   False
    1   2   5   True
    2   3   4   True
    3   4   3   True
    4   5   2   True
    5   6   1   False

Или, альтернативно, используйте apply для применения функции:

df['D'] = df['B'].apply(lambda x: -x)
df
>>>     A   B   C        D
    0   1   6   False   -6
    1   2   5   True    -5
    2   3   4   True    -4
    3   4   3   True    -3
    4   5   2   True    -2
    5   6   1   False   -1
Другие вопросы по тегам