首页 > 编程问答 >有没有办法将 geopandas 函数应用于除了引发错误的行之外的所有行?

有没有办法将 geopandas 函数应用于除了引发错误的行之外的所有行?

时间:2024-08-01 05:49:26浏览次数:12  
标签:python pandas error-handling geopandas geos

我正在尝试将缓冲区应用于 600,000 行的地理数据帧(作为更大过程的一部分),gdf 包含几何线串和多线串。当我运行缓冲区代码行时:

gdf['buffer_geometry'] = gdf.buffer(305)

我收到以下错误:

GEOSException:TopologyException:分配的深度在-12250000 3700000处不匹配

我迭代了地理数据帧,发现此错误是在2 个不连续的行(索引 4934 和索引 80,023)。

我不关心为这两行计算缓冲区 - 相反,我想在代码中设置逻辑来计算除这些行之外的所有行的缓冲区两个引发错误,并在这两行中返回 None

我知道这违背了 pandas 的设计工作原理 - 但有没有一种方法可以在不迭代的情况下完成此任务每行单独?我需要优先考虑让大多数行成功且快速地运行,而不是让每一行都填充缓冲区。

下面是我编写的逐行循环,以说明我想要实现的目标,但这是一种方式放慢速度以满足我的需求。

# To stop the loop
max = len(gdf)

# Indices
start = 0
end = 1

failed_index = []
while start <= max:
    GDF_copy = GDF.copy()
    GDF_copy = GDF_copy[start:end]

    # Try to return buffer geometry
    try:
        buffer = GDF_copy['line_geom'].buffer(305)
        GDF.loc[start, ['buffer_geom']] = buffer

    # If buffer function fails, return None
    except:
        GDF.loc[start, ['buffer_geom']] = None
        failed_index.append(start)
    
    start += 1
    end += 1

可以使用 apply 方法和 try-except 块在 GeoDataFrame 上应用缓冲区函数,同时处理引发错误的特定行。这将允许为大多数行计算缓冲区,同时在遇到错误时在相应行中插入 None

这是一个示例:

import geopandas as gpd

def calculate_buffer(geom):
    try:
        return geom.buffer(305)
    except Exception as e:
        print(f"Error encountered while buffering geometry at index {geom.name}: {e}")
        return None

# 从现有 GeoDataFrame 创建示例 GeoDataFrame
gdf = gpd.GeoDataFrame({
    'id': [1, 2, 3, 4, 5],
    'geometry': [
        Point(1, 1),
        Point(2, 2),
        # 创建一个无效的几何图形以引发错误
        LineString([(0, 0), (1, 1), (1, nan)]),
        Point(3, 3),
        Point(4, 4)
    ]
})

# 使用 apply 应用缓冲区函数,处理错误
gdf['buffer_geometry'] = gdf['geometry'].apply(calculate_buffer)

print(gdf)

此代码首先定义了一个名为 calculate_buffer 的函数,该函数包含计算缓冲区的逻辑。在 try-except 块内,它尝试计算给定几何图形的缓冲区。如果遇到任何错误,它将打印一条错误消息(包括索引以供调试)并返回 None 。否则,它将返回计算出的缓冲区几何图形。

然后,代码使用 apply 方法将 calculate_buffer 函数应用于 GeoDataFrame 的 geometry 列。这将为每一行执行函数,并将结果存储在新列 buffer_geometry 中。

通过这种方法,应该能够有效地处理大型 GeoDataFrame,同时在遇到问题几何图形时保持代码的弹性。

标签:python,pandas,error-handling,geopandas,geos
From: 78818424

相关文章

  • 使用Python时如何避免`setattr`(和`getattr`)?以及是否有必要避免
    如果我想向协议缓冲区中的字段添加一个在编译时未知的值,我目前正在做setattr我通常不喜欢使用setattr,因为它看起来不太安全。但是当我知道该对象是protobuf时,我认为这很好,因为我设置它的值必须是protobuf允许的类型。所以也许它并不是真的不安全?让我举......
  • Java sshtools 生成的 EDDSA 签名与 Python 的 pycryptome 生成的签名不匹配
    我有一个python库,它使用pycryptodomelibrary使用openssh格式的ED25519私钥使用Ed25519算法对数据进行签名。然后需要使用sshtools库和相应的公钥在Java应用程序中验证签名。但是签名验证失败。约束:从文件中读取私钥/公钥很重要。我无法......
  • Elastic python请求超时错误:池达到最大大小,不允许更多连接
    我正在使用Elasticsearchpython模块。我正在尝试像这样建立到服务器的连接es=Elasticsearch([config.endpoint],api_key=config.key,request_timeout=config.request_timeout)服务器连接,然后我尝试执行丰富策略。es.enr......
  • 使用 python 将 JSON 数据空值导入数据库。收到此错误 - 数据需要字符串或类似字节的
    我正在尝试使用python将JSON数据集导入到我的PostgreSQL数据库,但在尝试导入null值时会抛出错误。表的名称是Loan_info。我在python中尝试过此操作:-forfieldinloan_info:ifloan_info[field]in['Null','null',None]:......
  • Python 将脚本转换为 exe 并给出 PermissionError
    我有一个Python(Windows10)脚本,其功能之一是创建备份。这是函数:defcreate_backups(self,file:str,counter:int=None)->None:counter=counteror1res=self.re_obj.match(file)ifresisNoneorlen(res.groups())==0:back_file=......
  • conda update python 不会更新,但 conda update --all 会更新
    我正在尝试更新我的venv。这就是我看到的(base_test)>condaupdatepythonCollectingpackagemetadata(current_repodata.json):doneSolvingenvironment:done==>WARNING:Anewerversionofcondaexists.<==currentversion:4.10.3latestversion:24......
  • 如何使用 Selenium (python) 访问另一个影子根中影子根中的元素?
    我有以下代码和HTML结构(我不是这方面的专家)。我正在尝试抓取HTML代码末尾的96.00C元素,其路径是:Xpath://*[@id="_grid"]/set-class2/div2/text-binding//text()完整Xpath:/html/body/main/div/div3/div3/......
  • 在Python中,如何在一段时间内接受输入
    我正在尝试用Python制作一个蛇游戏,但不知道如何制作它,以便蛇在没有玩家输入的情况下继续移动,所以如果有人知道一个简单的方法来做到这一点,我需要在2秒后取消输入将不胜感激代码如下:importrandomimportsysplayerY=(1)playerX=(0)appleY=random.randint(1,10)appl......
  • 在Python中单步执行代码时是否可以引发异常
    当我在IDE(例如PyCharm)中单步执行代码时,我想转储函数的参数(以供以后使用,例如复制它)。计划的场景是在某处设置断点,然后引发异常(这不在我运行的代码中,这就是重点),并捕获它。代码应该如下所示:defexception_cathcher_decorator(func):try:returnfunc(*f_args,**f_k......
  • 解决python自动化操作异常处理的问题
    在python自动化领域,往往要用到pyautogui,pywin32等模块实现自动化操作。然而,这种自动化操作,本身具有一定的局限性,其中最主要的一个问题就是,一旦执行结果不按照脚本预设的来执行,往往会抛出异常,导致程序中断。解决这个问题,主要有这么几种思路:第一,每一次操作后分情况讨论。这种方......