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
25
A
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
.
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
Avaris, Cảm ơn rất nhiều câu trả lời của bạn! – archlight
Sẽ là một ý tưởng hay khi kết hợp nó như một tùy chọn trong fillna. – DanB
Đ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