2012-12-18 87 views
4

我想使用三次樣條填充DataFrame中一列中的空位。如果我要導出到列表,那麼我可以使用numpy的interp1d函數並將其應用於缺失的值。使用三次樣條在Pandas中插值時間序列

有沒有辦法在熊貓裏面使用這個函數?

+0

我很驚訝你接受這麼快的答案(沒有冒犯,海頓;)因爲我以爲你特別想插入時間序列,但我想你並不是完全意味着pandas.TimeSeries。我目前對這些話題也很感興趣。請參閱http://stackoverflow.com/questions/13941472/python-splines-or-other-interpolations-that-work-with-time-on-x-axis/13941980#comment19225878_13941980 –

回答

6

大多數numpy/scipy函數只需要參數爲「array_like」,iterp1d也不例外。幸運的串聯和數據幀都「array_like」所以我們並不需要離開大熊貓:

import pandas as pd 
import numpy as np 
from scipy.interpolate import interp1d 

df = pd.DataFrame([np.arange(1, 6), [1, 8, 27, np.nan, 125]]).T 

In [5]: df 
Out[5]: 
    0 1 
0 1 1 
1 2 8 
2 3 27 
3 4 NaN 
4 5 125 

df2 = df.dropna() # interpolate on the non nan 
f = interp1d(df2[0], df2[1], kind='cubic') 
#f(4) == array(63.9999999999992) 

df[1] = df[0].apply(f) 

In [10]: df 
Out[10]: 
    0 1 
0 1 1 
1 2 8 
2 3 27 
3 4 64 
4 5 125 

注:我不認爲把我的頭頂部的例子在一個數據幀進入通第二個參數(y)...但這也應該工作。

+0

啊。我懂了。如果你的interp1d函數中的X值是數據框索引值,你會怎麼做? – user1911866

+0

你可以設置'x = df.index',然後設置'pd.Series(f(x),index = x)'。 :) –

+0

好的謝謝你的幫助!而我希望的最後一件事。我有多個包含NaN數據的列。解決df.dropna()會丟失太多的行。你如何將它應用到一列(即'data1') – user1911866