我从这里的pandas DataFrame文档开始:http://pandas.pydata.org/pandas-docs/stable/dsintro.html
我想在一个时间序列的计算中用数值反复填充DataFrame。 所以基本上,我想用列A、B和时间戳行来初始化DataFrame,全部为0或全部为NaN。
然后我添加初始值,从之前的行开始计算新的行,例如row[A][t] = row[A][t-1]+1
之类的。
我目前正在使用下面的代码,但我觉得它有点难看,一定有办法直接用DataFrame来做,或者有更好的方法。 注意:我使用的是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
这里有几个建议。
使用date_range
作为索引。
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']
注意:我们可以创建一个空的DataFrame(有`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
因此,我们可以创建DataFrame。
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
*如果你只是想创建一个空的数据框,并在以后用一些传入的数据框来填充它,可以尝试这样做:**
在这个例子中,我使用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
*如果你想从一开始就把你的列名准备好,请使用这种方法:**。
import pandas as pd
col_names = ['A', 'B', 'C']
my_df = pd.DataFrame(columns = col_names)
my_df
如果你想在数据框中添加一条记录,最好使用:
my_df.loc[len(my_df)] = [2, 4, 5]
你也可能想传递一个字典。
my_dic = {'A':2, 'B':4, 'C':5}
my_df.loc[len(my_df)] = my_dic
然而,如果你想在my_df中添加另一个数据框架,请按以下步骤操作:
col_names = ['A', 'B', 'C']
my_df2 = pd.DataFrame(columns = col_names)
my_df = my_df.append(my_df2)
如果你在一个循环内添加行,考虑性能问题:
对于前1000条左右的记录,"my_df.loc"性能较好,但随着循环中记录数量的增加,性能逐渐变慢。
如果你打算在一个大的循环中做薄片(比如10M左右的记录):
你最好使用这两种方法的混合。
用iloc填充一个数据框,直到其大小达到1000左右,然后将其追加到原始数据框中,并清空临时数据框。
这将使你的性能提高10倍左右。