2012-05-05 187 views
25

我有一个DataFrame,比如一个波动表面,其索引为时间和列作为罢工。我如何做二维插值?我可以reindex但我该如何处理NaN?我知道我们可以fillna(method='pad')但它甚至不是线性插值。有没有一种方法可以插入我们自己的插值方法?在熊猫数据框上的插值

回答

33

您可以使用DataFrame.interpolate来获得线性插值。

In : df = pandas.DataFrame(numpy.random.randn(5,3), index=['a','c','d','e','g']) 

In : df 
Out: 
      0   1   2 
a -1.987879 -2.028572 0.024493 
c 2.092605 -1.429537 0.204811 
d 0.767215 1.077814 0.565666 
e -1.027733 1.330702 -0.490780 
g -1.632493 0.938456 0.492695 

In : df2 = df.reindex(['a','b','c','d','e','f','g']) 

In : df2 
Out: 
      0   1   2 
a -1.987879 -2.028572 0.024493 
b  NaN  NaN  NaN 
c 2.092605 -1.429537 0.204811 
d 0.767215 1.077814 0.565666 
e -1.027733 1.330702 -0.490780 
f  NaN  NaN  NaN 
g -1.632493 0.938456 0.492695 

In : df2.interpolate() 
Out: 
      0   1   2 
a -1.987879 -2.028572 0.024493 
b 0.052363 -1.729055 0.114652 
c 2.092605 -1.429537 0.204811 
d 0.767215 1.077814 0.565666 
e -1.027733 1.330702 -0.490780 
f -1.330113 1.134579 0.000958 
g -1.632493 0.938456 0.492695 

对于任何更复杂,需要转出自己的功能,将应对Series对象,并填写NaN值,你喜欢和返回另一个Series对象。

+0

Avaris,非常感谢您的答案! – archlight

+12

这是一个好主意,将它作为fillna中的一个选项。 – DanB

+1

如果在插值步骤中有另一维(或类别)保持不变(单独)会怎么样?即,我怎样才能将你的精彩解决方案与groupby结合起来?现在,如果索引有重复值(例如,它们在我希望分组的不同类别中是相同的),则reindex()步骤失败,声称“Reindexing只对唯一赋值的索引对象有效”。 (也许这应该是一个新问题?) – CPBL

6

旧的线程,但认为我会分享我的解决方案2d外插/插值,尊重索引值,这也是按需工作。代码结束了有点奇怪,让我知道是否有更好的解决方案:

import pandas 
from numpy import nan 
import numpy 

dataGrid = pandas.DataFrame({1: {1: 1, 3: 2}, 
          2: {1: 3, 3: 4}}) 


def getExtrapolatedInterpolatedValue(x, y): 
    global dataGrid 
    if x not in dataGrid.index: 
     dataGrid.ix[x] = nan 
     dataGrid = dataGrid.sort() 
     dataGrid = dataGrid.interpolate(method='index', axis=0).ffill(axis=0).bfill(axis=0) 

    if y not in dataGrid.columns.values: 
     dataGrid = dataGrid.reindex(columns=numpy.append(dataGrid.columns.values, y)) 
     dataGrid = dataGrid.sort_index(axis=1) 
     dataGrid = dataGrid.interpolate(method='index', axis=1).ffill(axis=1).bfill(axis=1) 

    return dataGrid[y][x] 


print getExtrapolatedInterpolatedValue(2, 1.4) 
>>2.3 
+0

漂亮的解决方案。对我来说工作得很好。感谢您的发表! – HeinzKurt