Creating an empty Pandas DataFrame, then filling it?
我从熊猫数据框架文档开始:http://pandas.pydata.org/pandas-docs/stable/dsintro.html
我想用时间序列计算中的值迭代地填充数据帧。所以基本上,我想用列A、B和时间戳行初始化数据帧,全部是0或全部是NaN。
然后,我添加初始值,并遍历这些数据,从前面的行计算新行,比如说
我目前正在使用下面的代码,但我觉得这有点难看,必须有一种直接使用数据帧的方法,或者只是一种更好的方法。注意:我使用的是python 2.7。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
以下是一些建议:
索引使用
1 2 3 4 5 6 7 8 | 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'] |
注意:我们可以通过编写以下内容来创建一个空数据帧(使用
1 2 | df_ = pd.DataFrame(index=index, columns=columns) df_ = df_.fillna(0) # with 0s rather than NaNs |
要对数据进行这些类型的计算,请使用numpy数组:
1 | data = np.array([np.arange(10)]*3).T |
因此,我们可以创建数据帧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 |
如果只想创建一个空数据帧,并在以后用一些传入的数据帧填充它,请尝试以下操作:
在这个示例中,我使用这个pandas文档创建一个新的数据帧,然后使用append使用来自olddf的数据写入newdf。
看看这个
1 2 3 4 | 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 |
- 如果我必须将新数据从一个oldfs,我只使用for循环迭代pandas.dataframe.append()。
如果您希望从一开始就将列名放置到位,请使用以下方法:
1 2 3 4 5 | import pandas as pd col_names = ['A', 'B', 'C'] my_df = pd.DataFrame(columns = col_names) my_df |
如果要向数据帧添加记录,最好使用:
1 | my_df.loc[len(my_df)] = [2, 4, 5] |
您可能还需要传递一个字典:
1 2 | my_dic = {'A':2, 'B':4, 'C':5} my_df.loc[len(my_df)] = my_dic |
但是,如果要向我的"数据框"中添加另一个数据框,请执行以下操作:
1 2 3 | col_names = ['A', 'B', 'C'] my_df2 = pd.DataFrame(columns = col_names) my_df = my_df.append(my_df2) |
如果要在循环中添加行,请考虑性能问题;对于大约前1000条记录,"my-df.loc"的性能更好,并且随着循环中记录数的增加而逐渐变慢。
如果你计划在一个大的循环中做一些事情(比如说10米?记录或其他)你最好使用这两者的混合物;在数据帧中填充iloc,直到大小达到1000左右,然后将其附加到原始数据帧中,并清空临时数据帧。这会使你的表现提高10倍左右
假设数据帧有19行
1 2 3 4 5 | index=range(0,19) index columns=['A'] test = pd.DataFrame(index=index, columns=columns) |
保持A列不变
1 | test['A']=10 |
将列B保持为循环给定的变量
1 2 | for x in range(0,19): test.loc[[x], 'b'] = pd.Series([x], index = [x]) |
您可以用任何值替换