关于python:创建一个空的pandas数据帧,然后填充它?

Creating an empty Pandas DataFrame, then filling it?

我从熊猫数据框架文档开始:http://pandas.pydata.org/pandas-docs/stable/dsintro.html

我想用时间序列计算中的值迭代地填充数据帧。所以基本上,我想用列A、B和时间戳行初始化数据帧,全部是0或全部是NaN。

然后,我添加初始值,并遍历这些数据,从前面的行计算新行,比如说row[A][t] = row[A][t-1]+1左右。

我目前正在使用下面的代码,但我觉得这有点难看,必须有一种直接使用数据帧的方法,或者只是一种更好的方法。注意:我使用的是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

以下是一些建议:

索引使用date_range

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']

注意:我们可以通过编写以下内容来创建一个空数据帧(使用NaNs):

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])

您可以用任何值替换pd.Series([x], index = [x])中的第一个x