Python 在区域中确定点并获得错误值错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()

Python 在区域中确定点并获得错误值错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all(),python,pandas,geopandas,shapely,Python,Pandas,Geopandas,Shapely,我有一个客户的列表,我想定义哪些客户在给定的区域或多边形列表中 from shapely.geometry import Polygon from shapely.geometry import Point import pandas as pd from shapely.wkt import loads import geopandas as gpd df=pd.read_csv("C:\\Users\\n.nguyen.2\\Documents\\order from May 1.csv")

我有一个客户的列表,我想定义哪些客户在给定的区域或多边形列表中

from shapely.geometry import Polygon
from shapely.geometry import Point
import pandas as pd
from shapely.wkt import loads
import geopandas as gpd
df=pd.read_csv("C:\\Users\\n.nguyen.2\\Documents\\order from May 1.csv")

geometry=gpd.points_from_xy (df['customer_lng'],df['customer_lat'])
crs={'init':'epsg:4326'}
gdf=gpd.GeoDataFrame(df,crs=crs,geometry=geometry)
gdf.head()

far_east= Polygon ([(103.91805, 1.3167), (103.92062, 1.31086), (103.92491, 1.29859), (103.96208, 1.31395), (104.00447845458986, 1.30966224489856), (104.02645111083986, 1.32819676167883), (104.04258728027344, 1.36217634666417), (104.01769638061523, 1.37968079509861), (103.997097, 1.390149), (103.976498, 1.392208), (103.96362304687501, 1.39564062116584), (103.95177841186523, 1.39804316627834), (103.9406204223633, 1.40044570893216), (103.93529891967773, 1.40027409882423), (103.92869, 1.4007), (103.91908, 1.39375), (103.91436, 1.38612), (103.9183, 1.3814), (103.9244, 1.36793), (103.92199, 1.35428), (103.92054, 1.35338), (103.92024, 1.35304), (103.9186, 1.35201), (103.9183, 1.35064), (103.915, 1.34793), (103.91472, 1.34776), (103.91459, 1.34755), (103.91439, 1.34739), (103.91427, 1.34726), (103.91393, 1.34697), (103.9126, 1.34631), (103.91144, 1.34604), (103.89942, 1.34278), (103.89629, 1.33802), (103.90217, 1.33223), (103.9074, 1.32631), (103.91092, 1.32369), (103.91406, 1.32198), (103.91422, 1.32105), (103.91419, 1.32039), (103.91805, 1.3167)])
east= Polygon  ([(103.91324043273929, 1.34664533115595), (103.89742610000008, 1.342355), (103.8942289352417, 1.34304143652896), (103.89186870000005, 1.3436426), (103.88508790000004, 1.3433418), (103.8831514120102, 1.34190717353805), (103.88207584619522, 1.34111345727885), (103.88165479999998, 1.3405959), (103.88049460000002, 1.3391478), (103.8774062, 1.3351903), (103.87541110000006, 1.3335226), (103.8722037, 1.3307341), (103.8684495, 1.3293188), (103.86686340000006, 1.3288479), (103.86384499999996, 1.3287118), (103.8668917, 1.3247646), (103.86723499999994, 1.319101), (103.86948800000005, 1.31554), (103.86908459999997, 1.3138004), (103.87028199999997, 1.309555), (103.86877959999993, 1.3053288), (103.86925210000004, 1.303312), (103.86534699999991, 1.299794), (103.86504660000001, 1.2968769), (103.86579759999996, 1.2926719), (103.87560780000003, 1.2777607), (103.89663629999995, 1.2938928), (103.9396375, 1.3075793), (103.94551690000002, 1.3080083), (103.96068739999998, 1.3143152), (103.95594519999997, 1.3204505), (103.95199709999999, 1.3244406), (103.94869259999996, 1.3283019), (103.94349979999993, 1.3313052), (103.93852170000002, 1.334952), (103.931784, 1.3418166), (103.91669920000004, 1.3483594), (103.91564369201662, 1.34879050707076), (103.91324043273929, 1.34664533115595)])
island= Polygon ([(103.74612808227538,1.2686455612039458),(103.72690200805664,1.292500533024804),(103.69342803955078,1.2964477370816825),(103.6805534362793,1.26675774823251),(103.69394302368164,1.2293444464408747),(103.72793197631836,1.2485660257767572),(103.74612808227538,1.2686455612039458)])

for row in gdf:
    if gdf['geometry'].within(far_east):
        gdf['answer']='Far_east'
    elif gdf['geometry'].within(east):
        gdf['answer']='East'
    else:
        gdf['answer']='Jurong_Island'                 

writer = pd.ExcelWriter("C:\\Users\\n.nguyen.2\\Documents\\order may define2.xlsx")
gdf.to_excel(writer, 'Sheet1', index=False)
writer.save()
我犯了这样一个错误:

ValueError回溯(最近一次调用)
在里面
16
17对于gdf中的行:
--->18如果gdf['geometry']在(远东)范围内
19 gdf[“答案”]=“远东”
20 elif gdf[“几何体”]。在(东)范围内:
~\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\core\generic.py in\uuuuu非零(self)
1476 raise VALUERROR(“a{0}的真值不明确。”
1477“使用a.empty、a.bool()、a.item()、a.any()或a.all()
->1478.格式(自身名称)
1479
1480 uuu bool uuuu=uuuu非零__
ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。
原始数据:


下面的代码似乎错误地使用了gdf,而gdf应该使用row

for row in gdf:
    if gdf['geometry'].within(far_east):
        gdf['answer']='Far_east'
    elif gdf['geometry'].within(east):
        gdf['answer']='East'
    else:
        gdf['answer']='Jurong_Island'   
应该是

for idx,row in gdf.iterrows():
    if row['geometry'].within(far_east):
        row['answer']='Far_east'
    elif row['geometry'].within(east):
        row['answer']='East'
    else:
        row['answer']='Jurong_Island'

另一方面,for循环毫无意义。您会得到错误,因为只有一些行可能位于区域内,但您需要使用gdf在一个区域中测试所有行。使用row将只检查一行,并且结果是明确的。但是请注意,写回可能不起作用

谢谢你的回复!但是我遇到了另一个问题:
Python Traceback(最近一次调用):File“”,第18行,if行['geometry']。in(fareast):TypeError:字符串索引必须是整数
Ok发现您也缺少iterrows,现在它变得复杂了。虽然这可能会起作用,但这不是熊猫应该被使用的方式。那么我应该如何纠正它呢?您能帮忙吗?您能将示例原始数据作为实际文本而不是图片发布吗?hi@Lee,现在错误是
Python文件“”,第27行elif行['geometry']。在(裕廊西区):^IndentationError:unindent不匹配任何外部缩进级别
您期望的是什么
gdf['geometry']。在(远东地区)
第18行吗?@Goyo感谢您的回复!我预计如果该点位于这些区域内,它将在“回答”列中说明区域名称哪个点<代码>gdf['geometry']不是一个点。geometry=gpd.points\u from_xy(df['customer\u lng'],df['customer\u lat'])这个定义的点?据我所知,应该是一个点列表。