我正在很长的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中遇到无效值
答案 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)