Python for循环遍历一列的所有行
Posted
技术标签:
【中文标题】Python for循环遍历一列的所有行【英文标题】:Python for-loop to go through all rows of one column 【发布时间】:2019-10-24 09:30:17 【问题描述】:我想从给定半径内的表格中提取所有坐标。 如何设置 for 循环?
为此我使用半正弦公式,我只输入中心点的纬度和经度值以及要测试的点的纬度和经度值(如果它在给定半径内)。
所以我认为我需要一个 for 循环,在其中为 lat 和 lon 列的每一行运行半正弦公式,如果坐标在半径内,我将它们保存在一个列表中。
#Get coordinates
#Center coordinates = nearest road location
lat1 = float(lowParkingUtilization.iloc[roadIndex].toLat)
lon1 = float(lowParkingUtilization.iloc[roadIndex].toLon)
#Test coordinates = scooter coordinates
insideRadius = []
radius = 2.50 # in kilometer
for i in eScooterVOI['lat']:
lat2 = float(eScooterVOI['lat'][i])
lon2 = float(eScooterVOI['lon'][i])
a = haversine(lon1, lat1, lon2, lat2)
if a <= radius:
insideRadius += str(lon2)+","+str(lat2)
else:
使用给定的代码,我收到以下错误消息:
File "<ipython-input-574-02dadebee55c>", line 18
^
SyntaxError: unexpected EOF while parsing
【问题讨论】:
您需要在else
块中添加一些代码。
你可以从你的代码中删除else
,因为它没有做任何事情。或者你可以把else: pass
(带缩进)
【参考方案1】:
“如何设置 for 循环?”问题的正确答案是:你不知道。 pandas
数据帧不用于循环遍历它们的行。您需要做的是在数据框中创建两个新列,一列用于计算距离,另一列以您想要的格式存储名称:
eScooterVOI['dist'] = eScooterVOI.apply(lambda x: haversine(lon1, lat1, x['lon'], x['lat']), axis=1)
eScooterVOI['name'] = eScooterVOI['lon'].astype(str) + ',' + eScooterVOI['lat'].astype(str)
然后,要获取仅包含距离小于半径的坐标名称的列表,请使用:
insideRadius = list(eScooterVOI[eScooterVOI['dist'] <= radius]['name'])
顺便说一句:haversine
函数可以以接收pandas
系列而不是值的方式构建,这样它可以比使用df.apply
更快地实现,但这需要更改一些问题中没有的代码。
【讨论】:
【参考方案2】:SyntaxError: unexpected EOF while parsing
错误信息表示部分代码块未完成,已到达代码末尾。
您的else
块至少需要一行代码。
例如:
else:
lots_of_code_to_write_here
【讨论】:
【参考方案3】:由于您的 else
块,您遇到了此错误。
当 Python 读取它时,它期望编写一些代码。 Python 没有找到任何因此发生错误。
您的代码可能正在运行,只需删除 else
块,您可以使用 if
块而不必使用 else
块。
无论如何,如果您绝对想使用 else
块,请尝试类似的方法:
if a <= radius:
insideRadius += str(lon2)+","+str(lat2)
else :
pass
但我认为不推荐。
【讨论】:
以上是关于Python for循环遍历一列的所有行的主要内容,如果未能解决你的问题,请参考以下文章