【发布时间】:2014-04-06 09:54:18
【问题描述】:
假设我有一个带有数值类型索引的 pandas.Series,例如
pd.Series( [10,20], [1.1, 2.3] )
我们如何以 0.1 的间隔重新采样上述系列?看起来 .resample 函数仅适用于日期时间间隔?
【问题讨论】:
假设我有一个带有数值类型索引的 pandas.Series,例如
pd.Series( [10,20], [1.1, 2.3] )
我们如何以 0.1 的间隔重新采样上述系列?看起来 .resample 函数仅适用于日期时间间隔?
【问题讨论】:
一种选择是使用 cut 来对这些数据进行分箱(远不如重采样优雅,但在这里):
In [11]: cat, retbins = pd.cut(s.index, np.arange(1, 3, 0.1), retbins=True)
In [12]: s.index = retbins[cat.labels]
In [13]: s
Out[13]:
1.0 10
2.2 20
dtype: int64
如果你想用 how='sum' 重新采样:
In [14]: s = s.groupby(s.index).sum()
In [15]: s = s.reindex(retbins)
现在有很多 NaN,您现在可以按照 Tom 的建议进行插值:
In [16]: s.interpolate()
【讨论】:
这就是插值的名称。您可以将重采样视为插值的一种特殊情况。
In [24]: new_idx = s.index + pd.Index(np.arange(1.1, 2.3, .01))
In [25]: s.reindex(new_idx).interpolate().head()
Out[25]:
1.10 10.000000
1.11 10.083333
1.12 10.166667
1.13 10.250000
1.14 10.333333
dtype: float64
In [26]: s.reindex(new_idx).interpolate().tail()
Out[26]:
2.26 19.666667
2.27 19.750000
2.28 19.833333
2.29 19.916667
2.30 20.000000
dtype: float64
我们需要new_idx 是原始索引和我们想要插值的值的联合,这样原始索引就不会被删除。
看看插值方法:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.interpolate.html
【讨论】:
reindex().interpolate() API 诗句s.reindex(at=new_idx) 的想法?最初主要是为了让df.interpolate() 更容易编写。无论哪种方式,我都可以看到论点。
Float64Index 支持它们。但仍有一些棘手的问题,所以我尽量避免它们。
我不认为你可以有一个非整数索引,因为浮点比较操作。但是,对于 .1,您可以执行以下操作:
df = pd.DataFrame(index=range(100, 201)) [现在将代表 .1]df.fillna(method='pad', inplace=True)另外,您似乎根本不需要使用索引,您只想要数据之间的差距......
【讨论】: