Numpy.nanstd无法正确跳过通过Excel读取的DataFrame的Nan值

问题描述

我有一个名为“ 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