Numpy.nanstd 无法正确跳过通过 excel 读入的 DataFrame 的 nan 值

我有一个名为“nan_test.xlsx”的Excel 文件,如下所示(原始文件有空格,但在 python 中打印时,空格被替换为“NaN”:

    ID  Month1  Month2  Month3

0  ABC     1.0               

1  FFF     2.0     2.0     2.0

2  XYZ             3.0     3.0

我试图获得标准差,同时忽略空白/纳米值。


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


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


隔江千里
浏览 113回答 2
2回答

跃然一笑

它ddof=1导致第一行std返回NaN。ddof : int, optionalMeans 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 个非 NaN 值)。N - ddof = 1 - 1 = 0。除数为0,因此std返回NaN你需要ddof=0有第一行df['std'] = np.nanstd(df.iloc[:, 1:], axis=1, ddof=0)Out[416]:    ID  Month1  Month2  Month3  std0  ABC     1.0     NaN     NaN  0.01  FFF     2.0     2.0     2.0  0.02  XYZ     NaN     3.0     3.0  0.0

慕盖茨4494581

问题是您将 delta 自由度 ( ddof) 设置为 1。正如文档中所述np.nanstd:计算中使用的除数为 N - ddof,其中 N 表示非 NaN 元素的数量。默认情况下 ddof 为零。因此,通过将其设置为 1,当只有 1 个非 NaN 的值时,除数将变为 0,并且得到 NaN。如果更改为 set ddof=0,则第一行的标准差值为 0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python