首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:在遍历数据时继续经过"RuntimeError“

Python:在遍历数据时继续经过"RuntimeError“
EN

Stack Overflow用户
提问于 2021-07-29 07:29:02
回答 2查看 64关注 0票数 0

在遍历数据列表时,我该如何继续遍历RuntimeError?例如,假设我有如下函数f:

代码语言:javascript
运行
复制
t_ints = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
def f(x):
    for i in x:
        if i==3:
            continue
        
        elif i ==6:
            raise RuntimeError('NOP')
        print(f'Processing integer {i}')
    
    print("Done")
    return

f(t_ints)

该函数将打印除3之外的每个数字,传递3并继续到4。但是,当它达到6时,它将生成标题为NOP的RunTimeError I。因此,输出结果为:

代码语言:javascript
运行
复制
Processing integer 1
Processing integer 2
Processing integer 4
Processing integer 5
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
c:\Users\jalmendarez.MSQT\Visual Studio Code\Test Notebooks\Test Sheet 1.py in 
     251     return
     252 
---> 253 f(t_ints)

c:\Users\jalmendarez.MSQT\Visual Studio Code\Test Notebooks\Test Sheet 1.py in f(x)
      245 
      246         elif i ==6:
----> 247             raise RuntimeError('NOP')
     248         print(f'Processing integer {i}')
     249 

RuntimeError: NOP

我想要传递像上面这样的整数列表,并将t_ints循环中的函数应用于每个列表。

代码语言:javascript
运行
复制
z=[
    [11, 22, 33, 3, 55, 66, 87, 8, 9, 10],
    [31, 3, 53, 54, 3, 66, 7, 8, 9, 10],
    [2,4,6,8,10,11,35]
]

所以我编写了下面的代码来循环遍历每个列表,它忽略并传递3,然后继续列表。然而,当它遇到6时,由于错误而停止并不继续。我尝试使用try/except。我希望我的循环忽略RuntimeError('NOP')并继续。

代码语言:javascript
运行
复制
INPUT:
for i in z:
    try:
        f(i)
    except RuntimeError:
        pass
OUTPUT:
Processing integer 11
Processing integer 22
Processing integer 33
Processing integer 55
Processing integer 66
Processing integer 87
Processing integer 8
Processing integer 9
Processing integer 10
Done
Processing integer 31
Processing integer 53
Processing integer 54
Processing integer 66
Processing integer 7
Processing integer 8
Processing integer 9
Processing integer 10
Done
Processing integer 2
Processing integer 4

我想要的实际输出是:

代码语言:javascript
运行
复制
Processing integer 11
Processing integer 22
Processing integer 33
Processing integer 55
Processing integer 66
Processing integer 87
Processing integer 8
Processing integer 9
Processing integer 10
Done
Processing integer 31
Processing integer 53
Processing integer 54
Processing integer 66
Processing integer 7
Processing integer 8
Processing integer 9
Processing integer 10
Done
Processing integer 2
Processing integer 4
Processing integer 8
Processing integer 10
Processing integer 11
Processing integer 35

关于如何使用类似于"continue“的东西来跳过一个抛出的错误,有什么想法吗?

--编辑--阅读这个!!

好的,这是真正的问题,因为它与我上面创建的函数没有任何关系。很抱歉读了很长时间,但这是必要的。

我创建了函数f作为示例,以查看是否可以通过RunTimeError。这是为了解决我的一个更大的问题。我有大约一百万行和23列的df。有一个ID栏。但实际上,只有大约18,000个唯一的ids。因此,我创建了一个for循环,它遍历每个唯一的ID。在这个循环中,我为每个ID创建了一个具有行/列的过滤数据帧。使用过滤后的数据,我根据列中的可用值和我创建的一些函数来运行曲线拟合,以计算指数下降曲线。这是一个简单的方程式。http://www.petrocenter.com/reservoir/DCA_theory.htm

一旦运行了曲线拟合,我就将曲线拟合求解的参数插入到指数下降曲线函数中。我将该函数的新值作为新列添加到for循环中唯一ID的dataframe中。然后,我将每个唯一的I数据帧与新的曲线拟合函数数据列一起存储在一个字典中。因此,我可以访问具有原始值的每个IDs数据帧,并使用指数下降曲线拟合基于曲线的估计值。

基本上我的曲线拟合了18,000次。通过这个过程,一些曲线拟合产生了无法解决曲线拟合的RunTimeError。不是所有的问题都能解决,我觉得没问题。我没有时间检查18,000个唯一的it数据,以确保它足够干净,可以进行曲线拟合。因此,我希望能够跳过出现RunTimeError的那些ID实例,并转到for循环中的下一个惟一ID。

EN

回答 2

Stack Overflow用户

发布于 2021-07-29 07:36:47

实现问题是您的错误处理程序必须位于您希望处理错误的级别。您的代码无法处理处理循环中的错误。当引发错误时,函数将退出循环,退出函数,并引发错误供调用程序处理。现在继续循环已经太晚了。

如果要在函数内继续循环,则必须处理函数内的异常。很简单,您根本不应该引发异常。正如您已经描述了所需的功能,case 3和case 6之间没有区别。

代码语言:javascript
运行
复制
def f(x):
    for i in x:
        if i == 3 or i == 6:
            continue
        
        print(f'Processing integer {i}')
    
    print("Done")
    return

对OP编辑的响应

我认为您已经确定了post的核心问题:在您发布的代码中,循环本身引发异常;在实际示例中,循环调用一个函数,然后该函数引发异常。看起来你需要的代码很简单,就像这样:

代码语言:javascript
运行
复制
for row in df:
    try:
        params = fit_function(row)
    exception RuntimeError:
        print(row, " failed to fit.)
        continue   # if there is more row processing for a successful fit.
票数 0
EN

Stack Overflow用户

发布于 2021-07-29 07:40:56

问题是您正在捕获,并且只处理外部循环中的异常。您的函数f没有对您引发的异常进行任何处理。我认为你需要抛出一个异常,否则在36之间没有区别。第二个建议是改变你的函数f,使其更原子化,而不是运行在整个列表上,你可以有一个函数来测试每个元素,并在某些情况下引发异常。

f函数中使用try-catch,而不是通过z在循环中设置try-except块。你的代码应该是这样的:

代码语言:javascript
运行
复制
def f(x):
    for i in x:
        try:
            if i==3:
                continue        
            elif i ==6:
                raise RuntimeError('NOP')
            print(f'Processing integer {i}')
        except RuntimeError:
            continue
    
    print("Done")
    return
z=[
    [11, 22, 33, 3, 55, 66, 87, 8, 9, 10],
    [31, 3, 53, 54, 3, 66, 7, 8, 9, 10],
    [2,4,6,8,10,11,35]
]
for i in z:
    try:
        f(i)
    except RuntimeError:
        pass

-编辑后提供的详细信息代码更新-

代码语言:javascript
运行
复制
import pandas as pd
import logging

#Setup logging to a file
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)

#Your fit function
def fit(filtered_df):
     #Your exponential decline fit goes here
     return fit_results

#Reading your dataset
df = pd.read_csv("all_your_data.csv")

#list of dataframes results
fit_results = []
#list of failed_ids
failed_ids = []
for unique_id in df.YOUR_ID_COLUMN.unique():
    try:
        fit_results.append(fit(df[df.YOUR_ID_COLUMN==unique_id]))
    except RuntimeError:
        failed_ids.append(unique_id)
        logging.error("{} curve fit failed".format(unique_id)) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68568404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档