Создание пустого фрейма данных 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 ответов:
вот несколько предложений:
использовать
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']Примечание: мы могли бы создать пустой фрейм данных (с
NaNs) просто написав: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
- если я должен продолжать добавлять новые данные в этот newDF от больше, чем один oldDFs, я просто использую цикл for для итерации панды.Фрейм данных.функции append()
если вы хотите, чтобы ваши имена столбцов были на месте с самого начала, используйте этот подход:
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]) с любым значением
Comments