我有一个各种时间序列的数据框,数据从不同的时间点开始。因此,为了获得相同的起点,它们都填充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
也不会改变任何内容。
那么我做错了什么?
答案 0 :(得分:4)
这是pandas / numpy的一个众所周知的混乱问题。简而言之,操作的实际结果将取决于您已安装的bottleneck
版本,因为大熊猫会延迟这些计算的瓶颈。另请参阅https://github.com/pydata/pandas/issues/9422(和GH11409)
bottleneck
将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
如果安装了瓶颈,这将用于此计算。以前,瓶颈也会返回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 /瓶颈之间有所不同。