Python перебирает CSV и выполняет точку в операции многоугольника - PullRequest
0 голосов
/ 03 мая 2018

Моя цель - выполнить итерацию по фрейму данных из файла 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'])

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

enter image description here

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

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

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

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
0 голосов
/ 03 мая 2018

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

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
0 голосов
/ 03 мая 2018

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

...