我的目标是从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'])
我的数据框架如下所示
答案 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