使用和不使用索引初始化pandas数据帧会产生不同的结果

时间:2012-02-23 21:14:19

标签: python numpy pandas

如果我使用以下方法构建pandas.DataFrame,我会得到一个(我认为)特殊的输出:

import pandas, numpy

df = pandas.DataFrame(
    numpy.random.rand(100,2), index = numpy.arange(100), columns = ['s1','s2'])
smoothed = pandas.DataFrame(
    pandas.ewma(df, span = 21), index = df.index, columns = ['smooth1','smooth2'])

当我去看看平滑的值时,我得到:

>>> smoothed.tail()
smooth1  smooth2
95      NaN      NaN
96      NaN      NaN
97      NaN      NaN
98      NaN      NaN
99      NaN      NaN

这似乎是以下碎片调用的集合,它产生不同的结果:

smoothed2 = pandas.DataFrame(pandas.ewma(df, span = 21))
smoothed2.index = df.index
smoothed2.columns = ['smooth1','smooth2']

再次使用DataFrame.tail()调用我得到:

>>> smoothed2.tail()
smooth1   smooth2
95  0.496021  0.501153 
96  0.506118  0.507541
97  0.516655  0.544621
98  0.520212  0.543751
99  0.518170  0.572429

任何人都可以提供为什么这些DataFrame构造方法应该有所不同的理由吗?

1 个答案:

答案 0 :(得分:5)

ewma(df, span=21)的结果已经是DataFrame,因此当您将其与列表列表一起传递给DataFrame构造函数时,它会“选择”您传递的列。在这种特殊情况下,很难打破标签和数据之间的联系。如果您这样做了:

In [23]: smoothed = DataFrame(ewma(df, span = 21).values, index=df.index, columns = ['smooth1','smooth2'])
In [24]: smoothed.head()
Out[24]: 
    smooth1   smooth2
0  0.218350  0.877693
1  0.400214  0.813499
2  0.308564  0.739426
3  0.433341  0.641891
4  0.525260  0.620541

这没问题。当然

smoothed = ewma(df, span=21)
smoothed.columns = ['smooth1', 'smooth2']

也很好