2012-05-05 7 views
25

나는 DataFrame을 가지고 있습니다. 예를 들어 시간과 열의 인덱스가 파업으로 나타나는 변동성 표면을 말합니다. 어떻게 2 차원 보간을합니까? 나는 reindex 일 수 있지만 어떻게 NaN을 처리하나요? 나는 우리가 fillna(method='pad') 수 있지만 그것은 심지어 선형 보간 수 없습니다 알아요. 보간 작업을 위해 자체 메서드를 플러그인 할 수있는 방법이 있습니까?팬더에서 DataFrame의 보간

답변

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

보간 단계에서 상수 (분리)를 유지할 다른 치수 (또는 카테고리)가 있으면 어떻게됩니까? 즉, 귀사의 멋진 솔루션을 어떻게 그룹 바이와 결합 할 수 있습니까? 현재 색인으로 반복되는 값 (예 : 그룹화하려는 다른 카테고리에서 동일 함)이있는 경우 reindex() 단계가 실패하여 "고유 색인 객체로만 색인을 다시 생성합니다"라고 주장합니다. (아마도 이것은 새로운 질문이되어야 할 것입니까?) – 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