2012-05-05 4 views
25

Tôi có một DataFrame, nói một bề mặt biến động với chỉ mục là thời gian và cột là cảnh cáo. Làm thế nào để tôi làm nội suy hai chiều? Tôi có thể reindex nhưng làm cách nào để xử lý NaN? Tôi biết chúng ta có thể fillna(method='pad') nhưng nó thậm chí không phải là nội suy tuyến tính. Có cách nào chúng ta có thể cắm vào phương pháp riêng của chúng ta để làm nội suy?Nội suy trên DataFrame trong gấu trúc

Trả lời

33

Bạn có thể sử dụng DataFrame.interpolate để lấy nội suy tuyến tính.

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 

Đối với bất cứ điều gì phức tạp hơn, bạn cần phải lăn ra chức năng của riêng bạn mà sẽ đối phó với một đối tượng Series và điền NaN giá trị như bạn thích và trở về một đối tượng Series.

+0

Avaris, Cảm ơn rất nhiều câu trả lời của bạn! – archlight

+12

Sẽ là một ý tưởng hay khi kết hợp nó như một tùy chọn trong fillna. – DanB

+1

Điều gì sẽ xảy ra nếu có một thứ nguyên (hoặc danh mục) khác để giữ không đổi (riêng biệt) trong bước nội suy? tức là, làm thế nào tôi có thể kết hợp giải pháp tuyệt vời của bạn với một nhóm? Ngay bây giờ, nếu có các giá trị lặp lại của chỉ mục (ví dụ: chúng giống nhau trên các danh mục khác nhau mà tôi muốn nhóm theo), thì bước reindex() không thành công, xác nhận "Chỉ lập lại chỉ hợp lệ với các đối tượng Index có giá trị duy nhất". (Có lẽ đây nên là một câu hỏi mới?) – CPBL

6

Chủ đề cũ nhưng nghĩ rằng tôi sẽ chia sẻ giải pháp của mình với phép ngoại suy 2 chiều/nội suy, tôn trọng các giá trị chỉ mục, cũng hoạt động theo yêu cầu. Mã đã kết thúc hơi lạ nên hãy cho tôi biết nếu có giải pháp tốt hơn:

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

Giải pháp đẹp. Hoạt động rất tốt đối với tôi. Cảm ơn đã đăng bài viết! – HeinzKurt