我从panda DataFrame文档开始:数据结构简介
我希望在时间序列类型的计算中用值迭代地填充DataFrame。所以基本上,我想用列A、B和时间戳行初始化DataFrame,全部为0或全部为NaN。
然后,我将添加初始值,并遍历该数据,从前面的行计算新行,例如,行[A][t]=行[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),只需编写:
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
这是我用循环从几个列表中创建动态数据帧的方法
x = [1,2,3,4,5,6,7,8]
y = [22,12,34,22,65,24,12,11]
z = ['as','ss','wa', 'ss','er','fd','ga','mf']
names = ['Bob', 'Liz', 'chop']
一个循环
def dataF(x,y,z,names):
res = []
for t in zip(x,y,z):
res.append(t)
return pd.DataFrame(res,columns=names)
后果
dataF(x,y,z,names)
用列名初始化空框架
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
将另一帧附加到现有帧
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倍。
假设一个数据帧有19行
index=range(0,19)
index
columns=['A']
test = pd.DataFrame(index=index, columns=columns)
保持A列为常量
test['A']=10
将b列保持为循环给定的变量
for x in range(0,19):
test.loc[[x], 'b'] = pd.Series([x], index = [x])
可以用任何值替换pd.Series中的第一个x([x],index=[x])
如果您只是想创建一个空的数据帧,然后用一些传入的数据帧填充它,请尝试以下操作:
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
在本例中,我使用panda文档创建一个新的数据帧,然后使用append将来自oldDF的数据写入newDF。
如果我必须继续将新数据附加到这个新DF中一个旧DF,我只使用for循环来迭代pandas.DataFrame.append()
注意:append()自1.4.0版起已弃用。使用concat()