【问题标题】:Differences in result of df.mean() and df['column'].mean()df.mean() 和 df['column'].mean() 结果的差异
【发布时间】:2017-10-04 19:25:43
【问题描述】:

我只运行以下三行:

df = pd.read_hdf('data.h5')
print(df.mean())
print(df['derived_3'].mean())

第一个 print 列出了每一列的所有单独的手段,其中一个是

derived_3        -5.046012e-01

第二个print 仅给出此列的平均值并给出结果

-0.504715

尽管使用科学记数法和不使用科学记数法有所不同,但这些值不同 - 为什么会这样?


使用其他方法的示例

sum() 执行相同的操作会导致以下结果:

derived_3        -7.878262e+05

-788004.0

同样,结果略有不同,但 count() 返回相同的结果:

derived_3         1561285

1561285

还有df.head()的结果:

   id  timestamp  derived_0  derived_1  derived_2  derived_3  derived_4  \
0  10          0   0.370326  -0.006316   0.222831  -0.213030   0.729277   
1  11          0   0.014765  -0.038064  -0.017425   0.320652  -0.034134   
2  12          0  -0.010622  -0.050577   3.379575  -0.157525  -0.068550   
3  25          0        NaN        NaN        NaN        NaN        NaN   
4  26          0   0.176693  -0.025284  -0.057680   0.015100   0.180894   

   fundamental_0  fundamental_1  fundamental_2    ...     technical_36  \
0      -0.335633       0.113292       1.621238    ...         0.775208   
1       0.004413       0.114285      -0.210185    ...         0.025590   
2      -0.155937       1.219439      -0.764516    ...         0.151881   
3       0.178495            NaN      -0.007262    ...         1.035936   
4       0.139445      -0.125687      -0.018707    ...         0.630232   

   technical_37  technical_38  technical_39  technical_40  technical_41  \
0           NaN           NaN           NaN     -0.414776           NaN   
1           NaN           NaN           NaN     -0.273607           NaN   
2           NaN           NaN           NaN     -0.175710           NaN   
3           NaN           NaN           NaN     -0.211506           NaN   
4           NaN           NaN           NaN     -0.001957           NaN   

   technical_42  technical_43  technical_44         y  
0           NaN          -2.0           NaN -0.011753  
1           NaN          -2.0           NaN -0.001240  
2           NaN          -2.0           NaN -0.020940  
3           NaN          -2.0           NaN -0.015959  
4           NaN           0.0           NaN -0.007338  

【问题讨论】:

标签: python pandas mean


【解决方案1】:

pd.DataFrame 方法与pd.Series 方法

df.mean() 中,meanpd.DataFrame.mean,并作为单独的pd.Series 对所有列进行操作。返回的是pd.Series,其中df.columns 是新索引,每列的平均值是值。在您的初始示例中,df 只有一列,因此结果是一个系列的长度,其中索引是该列的名称,值是该列的平均值。

df['derived_3'].mean() 中,meanpd.Series.meandf['derived_3']pd.Seriespd.Series.mean 的结果将是一个标量。


显示差异

显示的不同是因为df.mean的结果是pd.Series,而float格式是由pandas控制的。另一方面,df['derived_3'].mean() 是 python 原语,不受 pandas 控制。

import numpy as np
import pandas as pd

标量

np.pi

3.141592653589793

pd.Series

pd.Series(np.pi)

0    3.141593
dtype: float64

不同的格式

with pd.option_context('display.float_format', '{:0.15f}'.format):
    print(pd.Series(np.pi))

0   3.141592653589793
dtype: float64

减少
将这些不同的方法视为降低维度或不降低维度是有用的。或者同义词,聚合或转换。

  • 减少pd.DataFrame 会导致pd.Series
  • 减少 pd.Series 会导致标量

减少的方法

  • mean
  • sum
  • std

【讨论】:

  • 我明白了。当您说“显示的差异”时,您的意思是计算实际上两种方式都完全正确,只是显示方式不同,或者如果我在执行计算时交换了两个示例,这实际上会扭曲我的结果吗?
  • 它们完全一样。 3.14159265359pd.Series(3.14159265359)里面的值是一样的。
  • @piRSquared 关于这个还有一个问题 - 我有这个操作df.ix[:, 2:-1] = df.ix[:, 2:-1] - df.ix[:, 2:-1].mean(),我希望标准化所有索引列,以便它们的平均值现在为 0。当我打印出之后的平均值时执行此操作时,它们都显示为非常小的数字,但没有一个完全为 0。无论如何我可以检查我的方程是否正确并且值实际上为零,或者我的方程是否错误并且它们将显示为 0 如果他们是?
  • 当你身处浮点世界时,没有精确的东西。这个非常小的数字足够接近于零。您可以使用np.isclose 来确定浮点数是否接近,在一定的容差范围内。如果您愿意,可以使用round 使其等于零。
猜你喜欢
  • 2023-01-26
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多