从下面的代码中,我尝试对数据帧的三列进行切片。 将其放入水平线中的 numpy 数组中,然后按(数据数量/15 和 15) reshape --> 这里我尝试将每 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)
输出:
正确
这表明数组中的所有值都是 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)
输出:
[南南南南]
现在,考虑如下数据框的示例,
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
关于python - 即使 NaN 是从 np.nanstd 填充的,如何忽略运行时错误? - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53962179/