为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

隔江千里 2023-06-27 17:59:21
我有一个名为“nan_test.xlsx”的Excel 文件,如下所示(原始文件有空格,但在 python 中打印时,空格被替换为“NaN”:    ID  Month1  Month2  Month30  ABC     1.0               1  FFF     2.0     2.0     2.02  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  Month30  ABC     1.0     NaN     NaN1  FFF     2.0     2.0     2.02  XYZ     NaN     3.0     3.0    ID  Month1  Month2  Month3  std0  ABC     1.0     NaN     NaN  NaN1  FFF     2.0     2.0     2.0  0.02  XYZ     NaN     3.0     3.0  0.0
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

它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 个非 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  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


查看完整回答
反对 回复 2023-06-27
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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

计算中使用的除数为 N - ddof,其中 N 表示非 NaN 元素的数量。默认情况下 ddof 为零。

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

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


查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信