在python中计算分数时如何跳过除以0的错误?

时间:2019-07-17 14:09:13

标签: python csv

我正在很长的CSV文件上运行以下功能。该函数每50行计算列MFE的Z分数。这50条线中的一些仅包含零,因此在计算Zscore时,程序将停止,因为它不能被零除。如何解决此问题,而不是停止程序运行,请在这些行的z分数上打印一个0?

def doZscore(csv_file, n_random):
    df = pd.read_csv(csv_file)
    row_start = 0
    row_end = n_random + 1
    step = n_random + 1
    zscore = []
    while row_end <= len(df):
         selected_rows = df['MFE'].iloc[row_start:row_end]
         arr = []
         for x in selected_rows:
              arr.append(float(x))
         scores = stats.zscore(arr)
         for i in scores:
              zscore.append(round(i, 3))
         arr.clear()
         row_start += step
         row_end += step
    df['Zscore'] = zscore
    with open(csv_file, 'w') as f:
         df.to_csv(f, index=False)
         f.close()
    return

我得到的错误是: /s/software/anaconda/python3/lib/python3.7/site-packages/scipy/stats/stats.py:2253:RuntimeWarning:true_divide返回(a-mns)/ sstd中遇到无效值

3 个答案:

答案 0 :(得分:1)

您可以执行以下两个选项之一:

if sum(arr) == 0:
    scores = [0]
else:
    scores = stats.zscore(arr)

重构的方式是:

scores = [0] if sum(arr) == 0 else scores = stats.zscore(arr)

两个都可以。

答案 1 :(得分:0)

只要您要这样做,就可以在scores = stats.zscore(arr)之前检查数组是否全为0,而改为scores = arr

答案 2 :(得分:0)

我猜scores = stats.zscore(arr)是分裂发生的地方吗?您可以添加检查以查看arr是否仅包含零,例如使用

if arr.count(0) == len(arr):
    scores = arr
else:
    scores = stats.zscore(arr)