gpt4 book ai didi

python - NaN 的数据帧的平均值是零,而不是 NaN

转载 作者:行者123 更新时间:2023-11-28 22:40:18 31 4
gpt4 key购买 nike

我有一个不同时间序列的数据框,其中数据从不同的时间点开始。因此,为了具有相同的起点,它们都用 NaN 填充,如下所示:

location    townA   townB
datanumber 1234 1235
1940-01-01 NaN NaN
1940-02-01 NaN NaN
1940-03-01 NaN NaN
1940-04-01 NaN NaN
1940-05-01 0.53 NaN

我需要获取我所有位置的平均值,所以看起来 meandf = locdf.mean(axis = 1) 应该可以完成这项工作。 documentation for pd.mean()告诉我

skipna : boolean, default True

Exclude NA/null values. If an entire row/column is NA, the result will be NA

它确实会跳过 NA 值(与 NaN 相同?),就像 pandas 中的所有其他函数一样,所以我希望得到这样的结果

1940-01-01    NaN
1940-02-01 NaN
1940-03-01 NaN
1940-04-01 NaN
1940-05-01 0.53

但是我明白了

1940-01-01    0
1940-02-01 0
1940-03-01 0
1940-04-01 0
1940-05-01 0.53

这在之后造成了严重破坏,因为 pandas 中的所有其他内容似乎都适用于 NaN,因此我一直在使用它。

再次指定它只是为了确保 skipna = 'True' 产生相同的结果,并且 numeric_only 也不会改变任何东西。

那我做错了什么?

最佳答案

这是 pandas/numpy 的一个已知混淆问题。简而言之,操作的实际结果将取决于您安装的 bottleneck 版本,因为 pandas 推迟了这些计算的瓶颈。另见 https://github.com/pydata/pandas/issues/9422 (和 GH11409)

瓶颈更改了其 nansum 的实现以在所有 NaN 数组而不是 NaN 上返回 0。这是为了匹配 numpy 的 nansum 的行为。因此,根据是否安装了瓶颈以及安装了哪个版本,pandas 中的实际行为可能会不一致。


NumPy 的行为:

In [2]: a = np.array([np.nan, np.nan, np.nan])

In [3]: a
Out[3]: array([ nan, nan, nan])

In [4]: np.nansum(a)
Out[4]: 0.0

逻辑是无的总和为 0(您在此处跳过所有 NaN 时什么也得不到)。

默认情况下,pandas 偏离此行为并且确实返回 NaN(您预期的结果):

In [6]: s = pd.Series(a)

In [7]: s.sum()
Out[7]: nan

当您安装瓶颈时,这将用于此计算。以前,bottleneck 也返回 NaN,因此无论是否安装了 bottleneck,您都会得到一致的行为。但是,更新版本的瓶颈更改了行为 (>= 1.0) 以匹配 numpy 的 nansum 的行为。
因此,如果您安装了此版本的瓶颈,您将看到另一种行为:

In [1]: a = np.array([np.nan, np.nan, np.nan])

In [2]: np.nansum(a)
Out[2]: 0.0

In [3]: s = pd.Series(a)

In [4]: s.sum()
Out[4]: 0.0

In [5]: import bottleneck

In [6]: bottleneck.__version__
Out[6]: '1.0.0'

我认为这两个结果(0 或 NaN)都有话要说,并且没有一个是“错误的”,但当然最令人困惑/有问题的是 pandas 和 numpy 之间的行为不同/瓶颈。

关于python - NaN 的数据帧的平均值是零,而不是 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33823161/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com