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

时间:2015-11-20 09:28:51

标签: python pandas nan

我有一个各种时间序列的数据框,数据从不同的时间点开始。因此,为了获得相同的起点,它们都填充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,默认为True

     

排除NA / null值。如果整行/列为NA,则结果为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

之后会造成严重破坏,因为大熊猫中的其他一切似乎与NaN一起使用,因此我一直在使用它。

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

那么我做错了什么?

1 个答案:

答案 0 :(得分:4)

这是pandas / numpy的一个众所周知的混乱问题。简而言之,操作的实际结果将取决于您已安装的bottleneck版本,因为大熊猫会延迟这些计算的瓶颈。另请参阅https://github.com/pydata/pandas/issues/9422(和GH11409

bottlenecknansum的实现更改为在所有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

如果安装了瓶颈,这将用于此计算。以前,瓶颈也会返回NaN,因此无论您是否安装了瓶颈,都会获得一致的行为。但是,更新版本的瓶颈改变了行为(> = 1.0)以匹配numpy' s 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)都有一些话要说,并且两者中没有一个是“错误的”,但当然最令人困惑/有问题的是行为大熊猫和numpy /瓶颈之间有所不同。