python - 即使从 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 替换它以消除警告?
解决方案
考虑所有 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
推荐阅读
- arrays - 如何将数组中的字符连接成字符串?
- python - 提供输入标签的单热编码标签
- javascript - 将javascript数组分配给具有属性名称的JSON对象列表?
- html - CSS元素中的复合标签
- python - Django 不会覆盖模板标签测试中的设置
- javascript - Javascript代码可以像函数一样写吗?
- javascript - 更改按钮文本和功能 onClick 在 Ipad/iPhone 上不起作用
- python - 为什么我在使用 OpenMP 的共享库中的函数在通过 swig 从子进程调用时会挂起?
- ruby-on-rails - docker-compose up 不断循环并出现 ERROR -- : No such file or directory @ rb_sysopen
- javascript - 更新古老的反应堆栈 - 元素类型无效