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.
因此,第一行的 N
是 1
(即只有 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
我有一个 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.
因此,第一行的 N
是 1
(即只有 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