2014-03-04 67 views
3

假設我有一個pandas.Series索引與數值類型例如重新採樣熊貓系列與數字索引

pd.Series([10,20], [1.1, 2.3]) 

我們如何重新採樣0.1以上的間隔序列?看起來像.resample func只適用於日期時間間隔?

回答

2

那去es通過插值的名稱。您可以將重採樣看作插值的特例。

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

+0

我認爲2.3重新編譯時會丟失,所以爲什麼結果不會增加... –

+0

好的結果。我應該仔細看看。關於'reindex()。interpolate()'API和's.reindex(at = new_idx)'''的思考?最初主要是爲了使'df.interpolate()更容易編寫。我可以看到任何方式的論點。 – TomAugspurger

+0

@AndyHayden和湯姆:現在是浮動可靠的指數值? –

0

以及我不認爲你可以有一個非整數索引,因爲浮點數比較操作。 .1,但是,你可以這樣做:

  • 創建一個新的df = pd.DataFrame(index=range(100, 201)) [的那些現在代表... 1]
  • 在100(原10)和200(原20)設置的值: 1.1和2.3
  • df.fillna(method='pad', inplace=True)

也,好像你甚至不真正需要使用索引的所有,你只是想要的數據之間的差距......

0

一種選擇是使用切割bin此數據(遠遠超過一個重採樣那麼優雅,但在這裏不用):

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 

說,如果你想與如何=「和」重新取樣:

In [14]: s = s.groupby(s.index).sum() 

In [15]: s = s.reindex(retbins) 

有很多的NaN現在,你可以現在,湯姆表明,插值:

In [16]: s.interpolate()