【发布时间】: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