问题描述
我有一个名为“ nan_test.xlsx”的excel file 看起来像这样(原始有空白,但是当用python打印时,空白被替换为'NaN':
ID Month1 Month2 Month3
0 ABC 1.0
1 FFF 2.0 2.0 2.0
2 XYZ 3.0 3.0
我试图在忽略空白/ nan值的同时获取标准偏差。
到目前为止,我已经有了这个,但是行为无处不在。正确为具有3个数字值,2个数字值和1个nan值的行执行std dev,而不是对具有2个nan值和1个数字值的行正确执行std dev。
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
解决方法
是foo ;
导致第一行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
(即只有一个非NaN值)。 1
。除数为N - ddof = 1 - 1 = 0
,因此0
返回std
您需要NaN
才能获得第一行
ddof=0
,
问题是您将自由度增量(ddof
)设置为1。正如np.nanstd
的文档中所述:
计算中使用的除数为N-ddof,其中N表示非NaN元素的数量。默认情况下,ddof为零。
因此,通过将其设置为1,当您只有1个不是NaN的值时,除数将变为0,并且您将获得NaN。
如果更改为设置ddof=0
,则第一行的标准偏差将得到值为0