为了账号安全,请及时绑定邮箱和手机立即绑定

即使从 np.nanstd 填充 NaN,如何忽略运行时错误?- Python

即使从 np.nanstd 填充 NaN,如何忽略运行时错误?- Python

莫回无 2021-09-28 13:56:30
从下面的代码中,我正在尝试对三列数据框进行切片。将其放在水平线上的 numpy 数组中,然后按(数据数/15 和 15 的数量)重新整形--> 在这里,我尝试将每 15 个数据分组为一行并计算其标准偏差。即使有 NaN,我也会尝试忽略数据框中的 NaN。因此我使用了 np.nanstd。代码如下所示:k=SpeedLane.iloc[:,0:3]k = k.valuesk = 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 替换它以消除警告?
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

考虑所有 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,请执行以下操作,


    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


查看完整回答
反对 回复 2021-09-28
  • 1 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信