2012-12-09 44 views
166

我從熊貓數據框文檔在這裏開始:http://pandas.pydata.org/pandas-docs/stable/dsintro.html創建一個空的Pandas DataFrame,然後填充它?

我想用時間序列類型的計算迭代填充數據框中的值。 所以基本上,我想初始化數據框與列A,B和時間戳記行,全部爲0或全部NaN。

然後,我會添加初始值,並從這行數據計算行之前的行,例如行[A] [T] =行[A] [T-1] +1左右。

我目前正在使用的代碼如下,但我覺得這是一種醜陋的,必須有一種方法來直接與數據框或一般更好的方式做到這一點。 注意:我正在使用Python 2.7。

import datetime as dt 
import pandas as pd 
import scipy as s 

if __name__ == '__main__': 
    base = dt.datetime.today().date() 
    dates = [ base - dt.timedelta(days=x) for x in range(0,10) ] 
    dates.sort() 

    valdict = {} 
    symbols = ['A','B', 'C'] 
    for symb in symbols: 
     valdict[symb] = pd.Series(s.zeros(len(dates)), dates) 

    for thedate in dates: 
     if thedate > dates[0]: 
      for symb in valdict: 
       valdict[symb][thedate] = 1+valdict[symb][thedate - dt.timedelta(days=1)] 

    print valdict 

回答

146

這裏有幾個建議:對於指數

使用:

import datetime 
import pandas as pd 
import numpy as np 

todays_date = datetime.datetime.now().date() 
index = pd.date_range(todays_date-datetime.timedelta(10), periods=10, freq='D') 

columns = ['A','B', 'C'] 

注:我們可以簡單地通過書面形式創建一個空的數據框(與NaN S):

df_ = pd.DataFrame(index=index, columns=columns) 
df_ = df_.fillna(0) # with 0s rather than NaNs 

做這些類型的計算的數據,使用一個numpy的數組:

data = np.array([np.arange(10)]*3).T 

因此,我們可以創建數據框:

In [10]: df = pd.DataFrame(data, index=index, columns=columns) 

In [11]: df 
Out[11]: 
      A B C 
2012-11-29 0 0 0 
2012-11-30 1 1 1 
2012-12-01 2 2 2 
2012-12-02 3 3 3 
2012-12-03 4 4 4 
2012-12-04 5 5 5 
2012-12-05 6 6 6 
2012-12-06 7 7 7 
2012-12-07 8 8 8 
2012-12-08 9 9 9 
+2

pd.date_range()對我不起作用。我嘗試使用DateRange(來自eclipse的自動完成),但它與字符串一起使用作爲日期格式,對嗎? 整體方法雖然工作(我改變了其他指標)。 –

+0

是date_range是我可能通過升級獲得的新功能,或者它是否在datatime中(我更改爲datetime,b/c我認爲這就是您的意思) –

+2

date_range是用於創建日期時間索引的工廠函數,並且是[ 0.8.0](http://pandas.pydata.org/pandas-docs/version/0.8.0/whatsnew.html?highlight=date_range),我肯定會推薦升級到最新的穩定版本(0.9.1)有很多錯誤修復和新功能。:) –

45

如果你只是想創建一個空的數據幀和稍後用一些輸入數據幀填充它,試試這個:

在這個例子中,我使用this pandas doc創建一個新的數據幀,然後使用append用來自oldDF的數據寫入newDF。


看一看這個

newDF = pd.DataFrame() #creates a new dataframe that's empty 
newDF = newDF.append(oldDF, ignore_index = True) # ignoring index is optional 
# try printing some data from newDF 
print newDF.head() #again optional 
  • 如果我必須不斷追加新的數據從超過 一個oldDFs這newDF,我只是用一個for循環遍歷 pandas.DataFrame.append()
+2

請注意,'append'(以及類似'concat')副本整個數據集每次都會添加到一個新對象,因此迭代和追加可以並且會導致重大性能下降。更多信息請訪問:http://pandas.pydata.org/pandas-docs/stable/merging.html – MoustafaAAtta

相關問題