为啥 pandas.Series.std() 与 numpy.std() 不同?

Posted

技术标签:

【中文标题】为啥 pandas.Series.std() 与 numpy.std() 不同?【英文标题】:Why is pandas.Series.std() different from numpy.std()?为什么 pandas.Series.std() 与 numpy.std() 不同? 【发布时间】:2014-10-31 00:05:36 【问题描述】:

这就是我要解释的:

>>> pd.Series([7,20,22,22]).std()
7.2284161474004804
>>> np.std([7,20,22,22])
6.2599920127744575

答案:这是由Bessel's correction、N-1 解释,而不是标准差公式的分母中的N。我希望 Pandas 使用与 numpy 相同的约定。


有一个相关的讨论here,但他们的建议也不起作用。

我有许多不同餐厅的数据。这是我的数据框(想象不止一家餐厅,但效果只复制了一家):

>>> df
restaurant_id  price
id                      
1           10407      7
3           10407     20
6           10407     22
13          10407     22

问题:r.mi.groupby('restaurant_id')['price'].mean() 返回每​​个餐厅的价格平均值。我想得到标准偏差。但是,r.mi.groupby('restaurant_id')['price'].std() 返回错误值

如您所见,为简单起见,我只提取了一家包含四项商品的餐厅。我想找到价格的标准差。只是为了确保:

>>> np.mean([7,20,22,22])
17.75
>>> np.std([7,20,22,22])
6.2599920127744575

我们可以得到相同(正确)的值

>>> np.mean(df)
restaurant_id    10407.00
price               17.75
dtype: float64
>>> np.std(df)
restaurant_id    0.000000
price            6.259992
dtype: float64

(当然,忽略平均餐厅 ID。)显然,np.std(df) 不是我拥有多个餐厅的解决方案。所以我使用groupby

>>> df.groupby('restaurant_id').agg('std')
                  price
restaurant_id          
10407          7.228416

什么?! 7.228416 不是 6.259992。

让我们再试一次。

>>> df.groupby('restaurant_id').std()

同样的事情。

>>> df.groupby('restaurant_id')['price'].std()

同样的事情。

>>> df.groupby('restaurant_id').apply(lambda x: x.std())

同样的事情。

但是,这是可行的:

for id, group in df.groupby('restaurant_id'):
  print id, np.std(group['price'])

问题:有没有合适的方法来聚合数据框,所以我会得到一个新的时间序列,其中包含每家餐厅的标准差?

【问题讨论】:

pd.Series([7,20,22,22]).std(ddof=0)np.std 的数字相同 好的,已解决。我想我必须考虑一下,我要使用哪一个。 【参考方案1】:

我明白了。 Pandas 默认使用Bessel's correction——即标准差公式,分母为N-1,而不是N。正如 behzad.nouri 在 cmets 中指出的那样,

pd.Series([7,20,22,22]).std(ddof=0)==np.std([7,20,22,22])

【讨论】:

以上是关于为啥 pandas.Series.std() 与 numpy.std() 不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 NSFileManager 不能与 UIDocumentBrowserViewController 一起使用?

为啥将“viewWithTag”与“dequeueReusableCellWithIdentifier”一起使用?

为啥使用 LayoutInflater 与 xml 不同?

为啥 iOS viewPager 与 UISearchController 崩溃?

为啥没有多个 NSSortDescriptor 与 NSFetchedResultsController 一起工作

为啥颤振分析与飞镖分析不同?