pandas 捕获ZeroDivisionError但跳过Dataframe列中的所有迭代

d8tt03nd  于 2023-06-04  发布在  其他
关注(0)|答案(2)|浏览(132)

为了避免除以零,以下逻辑旨在计算百分比变化并跳过前一个月的值为0的值。但是,即使在引用的列中存在有效的非NaN非零数字,以下操作也会将所有百分比更改生成为null。

df_ex['metric_diff'] = (df_ex['metric_lastmonth'] - df_ex['metric_thismonth'])
try:
    df_ex['metric_pctdiff'] = (df_ex['metric_lastmonth'] - df_ex['metric_thismonth'])/df_ex['metric_thismonth']
except ZeroDivisionError:
    df_ex['metric_pctdiff'] = np.nan

print(len(df_ex[df_ex['metric_diff'].notna()]))
521
print(len(df_ex[df_ex['metric_pctdiff'].notna()]))

0

输出指示存在与非NaN值的标称差异,但是当比较相同的两列时,百分比差异比较产生所有NaN值。我是不是犯了什么逻辑错误?这里出了什么问题?
其他详细信息:这是一个DataFrame的示例。

在这个例子中,有两行我们有上个月的非空值。

并且......所需输出应如下所示:

7lrncoxx

7lrncoxx1#

当你除以零时,Pandas会返回inf,当你除以零时,Pandas会返回NaN,这就是为什么你的ZeroDivisionError没有被捕获,你得到了一个返回值NaN
我们可以使用下面的代码手动处理您想要的情况,它将计算非零'metric_thismonth'的百分比差异,并将NaN放置为零'metric_thismonth'
edit:让我们尝试在apply()函数中使用lambda函数

import pandas as pd
import numpy as np

df_ex['metric_diff'] = df_ex['metric_lastmonth'] - df_ex['metric_thismonth']

df_ex['metric_pctdiff'] = df_ex.apply(lambda row: (row['metric_diff'] / row['metric_lastmonth']) 
                                       if row['metric_lastmonth'] != 0 
                                       else np.nan, axis=1)
ccrfmcuu

ccrfmcuu2#

在两列上使用.fillna(0)可以解决问题(如另一个问题的解决方案中所述):

df_ex['metric_pctdiff'] = df_ex['metric_diff'].fillna(0) / df_ex['metric_lastmonth'].fillna(0)

相关问题