Python通过csv迭代并在多边形操作中执行点

时间:2018-05-03 13:21:47

标签: python pandas gis shapely

我的目标是从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 :(得分:1)

迭代数据帧通常效率不高。相反,您可能希望将csv文件读取到不同的数据框,并与X& Y坐标列上的当前数据框合并。

答案 1 :(得分:1)

我找到了另一种方法在两个地理数据帧上执行空间连接(合并)的解决方案

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

答案 2 :(得分:0)

据我所知,您的问题不是很清楚,但我假设您在询问如何根据以前的列创建新列?您几乎从不想遍历所有列,但如果Dataframe足够小,那么它当然不会成功。

如果可能,您将要使用矢量化:

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