2015-11-20 64 views
2

我有各种时间序列的数据框,其中数据从各个时间点开始。因此,具有相同的起点,他们都填充为NaN,就像这样: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, default True

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

它跳过NA值(这是一样的喃?),就像熊猫的所有其他功能做的,所以我希望像

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

您使用的是什么熊猫版本?这符合版本'0.17.0' – EdChum

+0

中描述的我在'0.14.1'。可能已经宣誓我几周前才更新。但是,[0.14.1文档](http://pandas.pydata.org/pandas-docs/version/0.14.1/generated/pandas.DataFrame.mean.html?highlight=mean#pandas.DataFrame.mean )也是这样说的。如果我做了一个'df.head()'并且我得到了上面的输出,那应该是真的意味着这是我的数据框,对吗?所以不能有任何隐藏的零? –

+0

但除了解释'为什么'的答案,我必须同意文档应该更新! – joris

回答

4

这是一个与熊猫/ numpy有关的已知混淆问题。总之,操作的实际结果将取决于您安装的bottleneck版本,因为熊猫会推迟这些计算的瓶颈。又见https://github.com/pydata/pandas/issues/9422(和GH11409

bottleneck改变其实施nansum对所有NaN数组,而不是NaN的返回0。这是为了匹配numpy的nansum的行为。出于这个原因,熊猫的实际行为可能会不一致,具体取决于是否安装了哪个版本的瓶颈。


的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你什么也得不到)。

默认情况下,熊猫从这种行为偏差和确实返回NaN(而你所期望的结果):

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

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

当你已经安装了瓶颈,这将被用于该计算。此前,瓶颈还会返回NaN,因此无论是否安装瓶颈,您都会得到一致的行为。然而,更新版本的瓶颈改变了行为(> = 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),并没有这两个是一'错',但是当然最令人困惑/问题的是大熊猫和numpy/bottleneck之间的行为不同。