【问题标题】:Is there a way to put multiple lines of code in a try except block and run then sequentially even if one throws an error?有没有办法将多行代码放在 try except 块中,然后按顺序运行,即使抛出错误?
【发布时间】:2021-06-30 08:06:45
【问题描述】:

我正在做一些数据分析并在 CSV 文件中创建新列。有时,当我遍历 pandas 数据框中的行时,会出现零除错误。发生这种情况时,我转到下一行。

更清洁的代码:

try:
    self.sf1.loc[ind, 'quick'] = (row['assets'] - row['inventory']) / row['liabilities']  # Quick
    self.sf1.loc[ind, 'current'] = row['assets'] / row['liabilities']  # Current
    self.sf1.loc[ind, 'financial_lev'] = row['debt'] / row['equity']  # Financial Lev

except ZeroDivisionError:
    continue

上面的代码比下面的其他方式更容易和更简洁。唯一的问题是,如果任何代码行抛出ZeroDivisionError,那么其他代码行都不会运行。

不干净的解决方案:

try:
    self.sf1.loc[ind, 'quick'] = (row['assets'] - row['inventory']) / row['liabilities']  # Quick
except ZeroDivisionError:
    continue
try:
    self.sf1.loc[ind, 'current'] = row['assets'] / row['liabilities']  # Current
except ZeroDivisionError:
    continue
try:
    self.sf1.loc[ind, 'financial_lev'] = row['debt'] / row['equity']  # Financial Lev
except ZeroDivisionError:
    continue

有没有办法做一些更类似于第一个代码气泡的事情,同时确保每一行代码都运行,即使上面的代码抛出错误?顺便说一句,这个尝试,除了块在熊猫iterrows()循环中。

【问题讨论】:

  • 写一个函数来做你想做的事,并在每一行调用它。
  • continue 是错误的。它在循环中使用以跳过循环的其余部分并继续下一次迭代,因此在这种情况下它将返回到您的 iterrows() loop 的顶部,并且如果不在循环的上下文中则根本不起作用。使用pass,你必须做“不干净”的方法来跳过失败的一行。

标签: python python-3.x pandas exception try-catch


【解决方案1】:

跳出@Barmar 的评论,编写如下函数。很难说它比你正在做的更好,但它最接近你的要求。总的来说,@Prune 的答案是完全正确的——try-except 的语义定义需要这种冗长。

def try_except_execution(ind, col1, numerator, denominator):
    try:
        self.sf1.loc[ind, col1] = numerator / denominator
    except ZeroDivisionError:
        pass

然后在每种情况下调用它:

try_except_execution(ind, 'quick', (row['assets'] - row['inventory']), row['liabilities'])

try_except_execution(ind, 'current', row['assets'], row['liabilities'])

try_except_execution(ind, 'financial_law', row['debt'] / row['equity'])

【讨论】:

    【解决方案2】:

    不,没有:这是try-except 范围的语义定义。

    我不明白您对使用多个 PANDAS 矢量化的抱怨,因为两个代码示例都使用相同的。唯一的区别是异常处理和延续。

    使用您当前的代码,请注意,如果您在第 4 行达到零除法,则第 5 行底部将保持不变。 如果您需要面向行的延续控制,则必须明确执行所有所需的除法,检查每个单独操作的异常,而不是整个向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-01
      • 2011-11-26
      • 2021-02-24
      • 1970-01-01
      • 2019-07-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多