2017-10-04 36 views
1

我运行只以下三行:的差异df.mean()和df [“列”]的结果平均(

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 
+0

此外,添加'df.dtypes'? – Zero

+0

加入我的帖子。这是一个非常大的文件,据我所知,一些数字有20个小数位,这些数字没有显示在熊猫的结果中。这可能会导致问题吗? – KOB

+0

也许,请参阅https://stackoverflow.com/questions/22107928/numpy-sum-is-not-giving-right-answer-for-float32-type和https://stackoverflow.com/questions/41705764/numpy -sum-giving-strange-results-on-large-arrays – Zero

回答

3

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和浮子格式由pandas控制。另一方面,df['derived_3'].mean()是python的基元,并不受熊猫的控制。

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
+0

我明白了。当你说“显示差异”时,你的意思是这两种计算方式实际上是完全正确的,只是显示方式不同,或者如果我在执行计算时互换了两个示例,这是否会实际影响我的结果? – KOB

+1

他们完全一样。 '3.14159265359'和'pd.Series(3.14159265359)'里面的值是一样的。 – piRSquared

+0

@piRSquared还有一个关于这个的问题 - 我有这个操作'df.ix [:, 2:-1] = df.ix [:, 2:-1] - df.ix [:, 2:-1]。 mean()',我期望对所有索引列进行归一化,以使它们的平均值为0.当我在执行此操作后打印出平均值时,它们都显示为非常小的数字,但不完全为0.是无论如何,我可以检查我的方程是否正确,并且这些值实际上是零,或者我的方程是否错误,如果它们显示为0? – KOB