Создание пустого фрейма данных Pandas, а затем его заполнение?


Я начинаю с документов фрейма данных pandas здесь:http://pandas.pydata.org/pandas-docs/stable/dsintro.html

Я хотел бы итеративно заполнить фрейм данных значениями в виде временного ряда расчета. Поэтому в основном я хотел бы инициализировать фрейм данных со столбцами A, B и строками временных меток, все 0 или все NaN.

затем я добавлю начальные значения и перейду к этим данным, вычисляя новую строку из предыдущей строки, скажем row[A][t] = row[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
4   231   2012-12-09 06:50:38

4 ответа:

вот несколько предложений:

использовать 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']

Примечание: мы могли бы создать пустой фрейм данных (с 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

Если вы просто хотите создать пустой фрейм данных и заполнить его некоторыми входящими фреймами данных позже, попробуйте следующее:

в этом примере я использую это панды док создать новый фрейм данных, а затем с помощью добавить для записи в newDF с данными из oldDF.


взгляните на это

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.линия контроля" производительность лучше, и постепенно она становится медленнее, увеличивая количество записей в цикле.

если вы планируете делать thins внутри Большой петли (скажем, 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])

вы можете заменить первый x в pd.Ряд ([x], индекс = [x]) с любым значением