Numpy.nanstd 没有为通过 excel 读入的 DataFrame 正确跳过 nan 值

Numpy.nanstd not skipping nan values correctly for DataFrame read in through excel

我有一个 excel file 叫 'nan_test.xlsx' 看起来像这样(原件有空白,但在 python 中打印时,空白被替换为 'NaN':

    ID  Month1  Month2  Month3
0  ABC     1.0               
1  FFF     2.0     2.0     2.0
2  XYZ             3.0     3.0

我试图在忽略 blank/nan 值的同时获得标准偏差。

截至目前,我已经有了这个,但行为无处不在。它正确地为具有 3 个数值、2 个数值和 1 个 nan 值的行执行 std dev,但不是具有 2 个 nan 值和一个数值的行。

df = pd.read_excel('nan_test.xlsx')
print(df)
df['std'] = np.nanstd(df.iloc[:, 1:], axis=1, ddof=1)
print(df)

    ID  Month1  Month2  Month3
0  ABC     1.0     NaN     NaN
1  FFF     2.0     2.0     2.0
2  XYZ     NaN     3.0     3.0
    ID  Month1  Month2  Month3  std
0  ABC     1.0     NaN     NaN  NaN
1  FFF     2.0     2.0     2.0  0.0
2  XYZ     NaN     3.0     3.0  0.0

ddof=1 导致第一行 std 返回 NaN

ddof : int, optional

Means Delta Degrees of Freedom. The divisor used in calculations is N - ddof, 
where N represents the number of non-NaN elements. By default ddof is zero.

因此,第一行的 N1(即只有 1 个 non-NaN 值)。 N - ddof = 1 - 1 = 0。除数是 0,所以 std returns NaN

您需要 ddof=0 才能获得第一行

df['std'] = np.nanstd(df.iloc[:, 1:], axis=1, ddof=0)

Out[416]:
    ID  Month1  Month2  Month3  std
0  ABC     1.0     NaN     NaN  0.0
1  FFF     2.0     2.0     2.0  0.0
2  XYZ     NaN     3.0     3.0  0.0

问题是您将增量自由度 (ddof) 设置为 1。正如 np.nanstd 的文档中所述:

The divisor used in calculations is N - ddof, where N represents the number of non-NaN elements. By default ddof is zero.

因此,通过将其设置为 1,当您只有 1 个不是 NaN 的值时,除数变为 0,并且您得到 NaN。

如果更改为设置 ddof=0,则第一行的标准偏差值为 0