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