2012-05-05 33 views
25

मेरे पास डेटाफ्रेम है, इंडेक्स के साथ अस्थिरता सतह के रूप में समय और कॉलम स्ट्राइक के रूप में कहें। मैं दो आयामी इंटरपोलेशन कैसे करूं? मैं 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

अवारी, आपके उत्तरों के लिए बहुत बहुत धन्यवाद! – archlight

+12

इसे भरने में एक विकल्प के रूप में शामिल करना एक अच्छा विचार होगा। – DanB

+1

क्या होता है यदि इंटरपोलेशन चरण में स्थिर (अलग) रखने के लिए कोई अन्य आयाम (या श्रेणी) है? यानी, मैं समूह के साथ अपने अद्भुत समाधान को कैसे जोड़ सकता हूं? फिलहाल, अगर इंडेक्स के दोहराए गए मान हैं (उदाहरण के लिए वे अलग-अलग श्रेणियों में समान हैं, जिन्हें मैं समूह करना चाहता हूं), रेइन्डेक्स() चरण विफल रहता है, "दावा करना कि विशिष्ट रूप से मूल्यवान इंडेक्स ऑब्जेक्ट्स के साथ केवल वैध है"। (शायद यह एक नया सवाल होना चाहिए?) – CPBL

6

पुराना धागा लेकिन सोचा कि मैं अपने समाधान को 2 डी एक्सट्रापोलेशन/इंटरपोलेशन के साथ साझा करूंगा, सूचकांक मूल्यों का सम्मान करता हूं, जो मांग पर भी काम करता है। कोड थोड़ा अजीब हो गया है तो मुझे बेहतर समाधान दें यदि 0 बेहतर समाधान है:

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

संबंधित मुद्दे