2014-10-22 6 views
6

इंटरपोल करें यह स्टैक ओवरफ्लो पर मेरा पहला प्रश्न है। मेरे साथ सामान्य रहो!दो पांडो डेटाफ्रेम को संयोजित करें, एक बार कॉलम पर दोहराएं,

मेरे पास अलग-अलग नमूना दरों के साथ विभिन्न अधिग्रहण प्रणालियों द्वारा एक साथ अधिग्रहित दो डेटा सेट हैं। एक बहुत नियमित है, और दूसरा नहीं है। मैं दोनों के संदर्भ के रूप में नियमित रूप से दूरी वाले टाइमस्टैम्प (सेकेंड में) का उपयोग करके डेटा सेट दोनों युक्त एक डेटाफ्रेम बनाना चाहता हूं। अनियमित रूप से नमूना डेटा नियमित रूप से दूरी वाले टाइमस्टैम्प पर अलग-अलग किया जाना चाहिए।

df1: 
    t y1 
0 0.0 0.0 
1 0.5 0.5 
2 1.0 1.0 
3 1.5 1.5 
4 2.0 2.0 

df2: 
    t y2 
0 0.00 0.00 
1 0.34 1.02 
2 1.01 3.03 
3 1.40 4.20 
4 1.60 4.80 
5 1.70 5.10 
6 2.01 6.03 

मैं y2 ​​interpolating, DF1 और df2 मर्ज करने के लिए कोशिश कर रहा हूँ:

import pandas as pd 
import numpy as np 

# evenly spaced times 
t1 = np.array([0,0.5,1.0,1.5,2.0]) 
y1 = t1 

# unevenly spaced times 
t2 = np.array([0,0.34,1.01,1.4,1.6,1.7,2.01]) 
y2 = 3*t2 

df1 = pd.DataFrame(data={'y1':y1,'t':t1}) 
df2 = pd.DataFrame(data={'y2':y2,'t':t2}) 

DF1 df2 इस तरह दिखना और:

यहाँ कुछ खिलौना डेटा मैं क्या करना है कोशिश कर रहा हूँ प्रदर्शन है df1.t पर वांछित परिणाम है:

df_combined: 
    t y1 y2 
0 0.0 0.0 0.0 
1 0.5 0.5 1.5 
2 1.0 1.0 3.0 
3 1.5 1.5 4.5 
4 2.0 2.0 6.0 

मैं pandas.resample के लिए दस्तावेज़ पढ़ने किया गया है, साथ ही पिछले stackoverflow सवाल खोज हूं, लेकिन अपने विशेष समस्या के लिए एक समाधान खोजने के लिए सक्षम है। कोई विचार? ऐसा लगता है कि यह आसान होना चाहिए।

अद्यतन: प्रथम, द्वितीय श्रृंखला को जोड़ है, तो पहले डेटा फ्रेम को संलग्न:

from scipy.interpolate import interp1d 
f2 = interp1d(t2,y2,bounds_error=False) 
df1['y2'] = f2(df1.t) 

जो देता है:

df1: 
    t y1 y2 
0 0.0 0.0 0.0 
1 0.5 0.5 1.5 
2 1.0 1.0 3.0 
3 1.5 1.5 4.5 
4 2.0 2.0 6.0 

काम करता है यही कारण है कि, लेकिन मैं मैं एक संभव समाधान पता लगा यदि कोई बेहतर तरीका है तो मैं अभी भी अन्य समाधानों के लिए खुला हूं।

+2

आपको अपने संपादन को उत्तर के रूप में जोड़ना चाहिए ताकि अन्य उन्हें – Stedy

+0

ढूंढ सकें, इसमें मुझे थोड़ी देर लग गई। अपनी खुद की पोस्ट का महान जवाब। धन्यवाद! मुझे लगता है कि यह पांडस में डेटाफ्रेम पर एक बुनियादी कार्यक्षमता होनी चाहिए, लेकिन मुझे लगता है कि कोई आंतरिक विधि नहीं है। – CodeMonkey

+0

मैंने अभी @ K3 --- आरएनसी से जवाब देखा है। मेरे अपने उत्तर से एक क्लीनर समाधान की तरह लगता है, लेकिन ऐसा लगता है कि या तो ठीक काम करेगा। धन्यवाद! – ollerend

उत्तर

1

आप श्रृंखला से एक भी DataFrame का निर्माण करते हैं, तो सूचकांक के रूप में समय मान का उपयोग कर, इस तरह:

>>> t1 = np.array([0, 0.5, 1.0, 1.5, 2.0]) 
>>> y1 = pd.Series(t1, index=t1) 

>>> t2 = np.array([0, 0.34, 1.01, 1.4, 1.6, 1.7, 2.01]) 
>>> y2 = pd.Series(3*t2, index=t2) 

>>> df = pd.DataFrame({'y1': y1, 'y2': y2}) 
>>> df 
     y1 y2 
0.00 0.0 0.00 
0.34 NaN 1.02 
0.50 0.5 NaN 
1.00 1.0 NaN 
1.01 NaN 3.03 
1.40 NaN 4.20 
1.50 1.5 NaN 
1.60 NaN 4.80 
1.70 NaN 5.10 
2.00 2.0 NaN 
2.01 NaN 6.03 

आप बस कर सकते हैं interpolate इसे, और केवल उस भाग का चयन करें जहां y1 परिभाषित किया गया है:

>>> df.interpolate('index').reindex(y1) 
     y1 y2 
0.0 0.0 0.0 
0.5 0.5 1.5 
1.0 1.0 3.0 
1.5 1.5 4.5 
2.0 2.0 6.0 
+0

अच्छा आसान समाधान। धन्यवाद। – ollerend

0

यह बिल्कुल स्पष्ट नहीं है कि आप वाई 2 में कुछ मूल्यों से कैसे छुटकारा पा रहे हैं, लेकिन ऐसा लगता है कि किसी दिए गए टाइमपॉइंट के लिए एक से अधिक है, तो आप केवल पहले को चाहते हैं। साथ ही, ऐसा लगता है कि आपके समय मूल्य सूचकांक में होना चाहिए। मैंने कॉलम लेबल भी जोड़े। यह इस तरह दिखता है:

import pandas as pd 

# evenly spaced times 
t1 = [0,0.5,1.0,1.5,2.0] 
y1 = t1 

# unevenly spaced times 
t2 = [0,0.34,1.01,1.4,1.6,1.7,2.01] 

# round t2 values to the nearest half 
new_t2 = [round(num * 2)/2 for num in t2] 

# set y2 values 
y2 = [3*z for z in new_t2] 

# eliminate entries that have the same index value 
for x in range(1, len(new_t2), -1): 
    if new_t2[x] == new_t2[x-1]: 
     new_t2.delete(x) 
     y2.delete(x) 


ser1 = pd.Series(y1, index=t1) 
ser2 = pd.Series(y2, index=new_t2) 

df = pd.concat((ser1, ser2), axis=1) 
df.columns = ('Y1', 'Y2') 

print df 

यह प्रिंट:

 Y1 Y2 
0.0 0.0 0.0 
0.5 0.5 1.5 
1.0 1.0 3.0 
1.5 1.5 4.5 
1.5 1.5 4.5 
1.5 1.5 4.5 
2.0 2.0 6.0 
संबंधित मुद्दे