首页 > 解决方案 > 即使从 np.nanstd 填充 NaN,如何忽略运行时错误?- Python

问题描述

从下面的代码中,我正在尝试对三列数据框进行切片。将它放在水平线上的 numpy 数组中,然后通过(数据数/15 和 15)重塑 - >在这里我尝试将每 15 个数据分组为一行并计算其标准偏差。

即使有,我也会尝试忽略数据框中的 NaN。因此我使用了 np.nanstd。

代码如下所示:

k=SpeedLane.iloc[:,0:3]
k = k.values
k = np.ravel(k)
k = np.reshape(k, ((len(k)//15, 15)))
Between_SL_sd = np.nanstd(k, axis=1)

执行代码后出现错误:

C:\Program Files\Anaconda3\lib\site-packages\numpy\lib\nanfunctions.py:1434: RuntimeWarning: Degrees of freedom <= 0 for slice. keepdims=keepdims)

我浏览了 Numpy 文档,发现 15x 数组中的一个已获取所有 NA 并返回此错误。

我承认这一点,但我仍然想忽略这个问题。或者有没有一种方法可以立即用 0 替换 NaN,然后​​用 NaN 替换它以消除警告?

标签: pythonpandasnumpyruntime-error

解决方案


考虑所有 nan 元素的一维数组,

arr = np.array([np.nan, np.nan, np.nan, np.nan])

np.isfinite() -> 逐元素测试有限性

bool_arr = np.isfinite(arr)
print(bool_arr)

输出:

[False False False False]

如果可迭代对象中有任何真值,则any -> 将返回 True。

chk = not any(bool_arr)
print(chk)

输出: True

这表明数组中的所有值都是 nan。现在,我们可以像这样用零替换所有 nan,

arr = np.nan_to_num(arr, copy=True)
print(arr)

输出: [0. 0. 0. 0.]

要将 0 转换回 nan,请执行以下操作,

arr[arr == 0] = 'nan' # or use np.nan
print(arr)

输出: [nan nan nan nan]

现在,考虑如下数据框的示例,

    col1    col2    col3    col4
0   5.0     1.0     6.0      NaN
1   2.0     2.0     1.0      NaN
2   NaN     NaN     NaN      NaN
3   3.0     4.0     NaN      NaN
4   NaN     NaN     NaN      NaN

要获取每一行的标准,请执行以下操作,

    std = []
for row in range(len(df)):
    k = df.iloc[row].values
    bool_arr = np.isfinite(k)
    chk = not any(bool_arr)
    if chk == True:
        k = np.nan_to_num(k, copy=True)
    st = np.nanstd(k)
    if chk == True:
        st = np.nan
    std.append(st)

data = {'std_row_wise': std}
std_df = pd.DataFrame(data = data)

std_df

输出:数据框的每个值都是std一行。

   std_row_wise
0   2.160247
1   0.471405
2   NaN
3   0.500000
4   NaN

推荐阅读