当前位置: 首页 > 面试题库 >

pandas:为什么pandas.Series.std()与numpy.std()不同

温镜
2023-03-14
问题内容

另一个更新:已解决(请参阅评论和我自己的答案)。

更新:这就是我要解释的。

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

答:这是通过贝塞尔校正N-1来解释的,而不是N通过标准偏差公式的分母来解释的。我希望熊猫使用与numpy相同的约定。

有一个相关的讨论在这里,但他们的建议都不能工作。

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

>>> 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'])

问题 :是否有适当的方法来汇总数据帧,所以我将获得一个带有每个餐厅标准差的新时间序列?


问题答案:

我懂了。熊猫默认使用Bessel校正-即标准差公式中使用N-1而不是N分母。正如behzad.nouri在评论中指出的那样,

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


 类似资料:
  • 从重新索引文档: 使用可选的填充逻辑将DataFrame与新索引一致,将NA/NaN放置在上一个索引中没有值的位置。除非新索引与当前索引等效,并且Cope=False,否则将生成新对象。 因此,我认为我可以通过在适当的位置(!)设置复制=False来重新排序。然而,我似乎得到了一个副本,需要再次将其分配给原始对象。我不想把它分配回去,如果我能避免它的话(原因来自于另一个问题)。 这就是我正在做的:

  • 在不应用我的日期解析器的情况下给出结果 显然我不明白https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html的指示

  • 在Google Colab中使用笔记本时,无论是否导入库,matplotlib绘图都具有不同的行为。 如果我不导入分析,默认情况下,绘图将以内联方式显示。但是,如果导入库,绘图将停止内联显示。 在导入pandas分析库之前更新它可以解决此问题 导入分析后添加可以解决此问题 在GoogleColab中运行此代码以重现问题。在导入和不导入U分析的情况下对其进行测试。对于每个测试,您都需要终止会话(运行

  • 问题内容: 关于运算符的Python文档说: 运算符和对象标识测试:当且仅当和是相同对象时为true 。产生反真值。 让我们尝试一下: 在Python文档也说: 由于自动进行垃圾回收,释放列表以及描述符的动态性质,您可能会注意到在某些运算符用法中,似乎存在异常行为,例如涉及实例方法或常量之间比较的行为。查看他们的文档以获取更多信息。 我搜索了更多的解释,但找不到任何解释。 为什么是假的? 我正在使

  • 主要内容:Pandas主要特点,Pandas主要优势,Pandas内置数据结构Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。Pandas 已经成为 Python 数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具。 图1:Pandas Logo Pandas 这个名字来源于面板数据(Panel

  • 问题内容: 切片是对基础数组的引用。这是有道理的,似乎可以在内置/原始类型上使用,但是为什么不能在结构上使用呢?我假设即使我更新了一个struct字段,引用/地址也仍然相同。 需要说明的是:我知道我可以在两种情况下都使用指针。我只是对为什么不更新结构感兴趣(与int不同)。 问题答案: 调用时要做的是传递一个包含值副本的新数组,并立即丢弃该数组。这与您使用基元不同,因为您保留了数组。 这里有两种方