2013-10-01 4 views
16

मैं समय से इंडैक्स डेटा है:पांडा - डेटा पंक्ति के सूचकांक को नई पंक्तियों के लिए सभी कॉलम को NaN पर सेट करें?

df2 = pd.DataFrame({ 'day': pd.Series([date(2012, 1, 1), date(2012, 1, 3)]), 'b' : pd.Series([0.22, 0.3]) }) 
df2 = df2.set_index('day') 
df2 
       b 
day    
2012-01-01 0.22 
2012-01-03 0.30 

क्या इतना है कि यह जनवरी 2012 (कहते हैं), जहां सभी स्तंभों NaN की तैयारी में हैं (में हर दिन के लिए एक पंक्ति है इस डेटा फ्रेम का विस्तार करने के लिए सबसे अच्छा तरीका है यहां केवल b) जहां हमारे पास डेटा नहीं है?

तो इच्छित परिणाम होगा:

   b 
day    
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 
2012-01-04 NaN 
... 
2012-01-31 NaN 

बहुत धन्यवाद!

उत्तर

3

के रूप में आप

df3 = df2.asfreq('D') 
df3 

Out[16]: 
       b 
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 

वांछित अपने दूसरे भाग का उत्तर देने के लिए आप आवृत्ति के रूप में दिन गुजर, एक fill_method पैरामीटर मौजूद मानों को निर्दिष्ट NaN भरा हो जाएगा बिना resample कर सकते हैं, मैं एक और अधिक सुरुचिपूर्ण रास्ता नहीं सोच सकते हैं पल:

df3 = DataFrame({ 'day': Series([date(2012, 1, 4), date(2012, 1, 31)])}) 
df3.set_index('day',inplace=True) 
merged = df2.append(df3) 
merged = merged.asfreq('D') 
merged 


Out[46]: 
       b 
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 
2012-01-04 NaN 
2012-01-05 NaN 
2012-01-06 NaN 
2012-01-07 NaN 
2012-01-08 NaN 
2012-01-09 NaN 
2012-01-10 NaN 
2012-01-11 NaN 
2012-01-12 NaN 
2012-01-13 NaN 
2012-01-14 NaN 
2012-01-15 NaN 
2012-01-16 NaN 
2012-01-17 NaN 
2012-01-18 NaN 
2012-01-19 NaN 
2012-01-20 NaN 
2012-01-21 NaN 
2012-01-22 NaN 
2012-01-23 NaN 
2012-01-24 NaN 
2012-01-25 NaN 
2012-01-26 NaN 
2012-01-27 NaN 
2012-01-28 NaN 
2012-01-29 NaN 
2012-01-30 NaN 
2012-01-31 NaN 

यह दूसरी बार श्रृंखला का निर्माण करती है और फिर हम सिर्फ संलग्न करें और के रूप में पहले asfreq('D') कहते हैं।

+0

धन्यवाद - इस छेद को भरने के लिए महान है, लेकिन कैसे मैं '2012-01-31' लिए विस्तार कर सकते हैं (कहते हैं)। – paul

+0

हम्म। लेकिन अगर मेरे मूल समय श्रृंखला में मेरे पास कई छेद/अंतराल हैं, तो यह अब और काम नहीं करता है। – paul

+0

@paul yes मेरा जवाब इस संबंध में सीमित है, मैं एक और सामान्य विधि के बारे में नहीं सोच सकता। डेटाफ्रेम को पहले स्थान पर सभी अपेक्षित मानों के साथ बनाना बेहतर होगा यदि आप कर सकें, तो मेरे पास एक प्लेराउंड होगा और देखें कि क्या मैं कुछ बेहतर तरीके से आ सकता हूं – EdChum

17

इस का उपयोग करें:

ix = pd.DatetimeIndex(start=date(2012, 1, 1), end=date(2012, 1, 31), freq='D') 
df2.reindex(ix) 

कौन देता है:

   b 
2012-01-01 0.22 
2012-01-02 NaN 
2012-01-03 0.30 
2012-01-04 NaN 
2012-01-05 NaN 
[...] 
2012-01-29 NaN 
2012-01-30 NaN 
2012-01-31 NaN 
2

यहाँ एक और विकल्प है: पहले, अंतिम दिन आप चाहते हैं पर एक NaN रिकॉर्ड जोड़ने तो resample। इस तरह से resampling आपके लिए गुम तिथियां भर जाएगा।

शुरू फ़्रेम:

import pandas as pd 
import numpy as np 
from datetime import date 

df2 = pd.DataFrame({ 'day': pd.Series([date(2012, 1, 1), date(2012, 1, 3)]), 'b' : pd.Series([0.22, 0.3]) }) 
df2= df2.set_index('day') 
df2 

Out: 
        b 
    day 
    2012-01-01 0.22 
    2012-01-03 0.30 

भरा फ़्रेम:

df2 = df2.set_value(date(2012,1,31),'b',np.float('nan')) 
df2.asfreq('D') 

Out: 
       b 
    day 
    2012-01-01 0.22 
    2012-01-02 NaN 
    2012-01-03 0.30 
    2012-01-04 NaN 
    2012-01-05 NaN 
    2012-01-06 NaN 
    2012-01-07 NaN 
    2012-01-08 NaN 
    2012-01-09 NaN 
    2012-01-10 NaN 
    2012-01-11 NaN 
    2012-01-12 NaN 
    2012-01-13 NaN 
    2012-01-14 NaN 
    2012-01-15 NaN 
    2012-01-16 NaN 
    2012-01-17 NaN 
    2012-01-18 NaN 
    2012-01-19 NaN 
    2012-01-20 NaN 
    2012-01-21 NaN 
    2012-01-22 NaN 
    2012-01-23 NaN 
    2012-01-24 NaN 
    2012-01-25 NaN 
    2012-01-26 NaN 
    2012-01-27 NaN 
    2012-01-28 NaN 
    2012-01-29 NaN 
    2012-01-30 NaN 
    2012-01-31 NaN 
संबंधित मुद्दे

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