Я начинаю с документов панд DataFrame здесь: http://pandas.pydata.org/pandas-docs/stable/dsintro.html
Я хотел бы итеративно заполнять DataFrame значениями для расчета временных рядов. В общем, я бы хотел инициализировать DataFrame столбцами A, B и строками отметок времени, все 0 или все NaN.
Затем я добавляю начальные значения и просматриваю эти данные, вычисляя новую строку из предыдущей строки, скажем row[A][t] = row[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
.append
pd и добавлением списка? Я знаю, что.append
в pandas копирует весь набор данных в новый объект ´, присоединяются ли питоны по-другому?Ответы:
Вот пара предложений:
Используйте
date_range
для индекса:Примечание: мы могли бы создать пустой DataFrame (с
NaN
s) просто написав:Чтобы выполнить такой тип вычислений для данных, используйте массив numpy:
Следовательно, мы можем создать DataFrame:
источник
index
x0
измерениями (columns = []
) и присоединение одного столбца за каждый оборот цикла. Я имеюdf[col_name] = pandas.Series([...])
в виду в цикле итерации по именам столбцов. В первом случае не только выделение памяти занимает много времени, но замена NaN новыми значениями кажется чрезвычайно медленной.Если вы просто хотите создать пустой фрейм данных и заполнить его несколькими входящими фреймами позже, попробуйте это:
В этом примере я использую этот панд документ , чтобы создать новый фрейм данных , а затем с помощью Append команду для записи в newDF с данными из oldDF.
Если мне нужно продолжать добавлять новые данные в этот newDF из более чем одного oldDF, я просто использую цикл for для перебора pandas.DataFrame.append ()
источник
append
(и аналогичноconcat
) копирует полный набор данных в новый объект каждый раз, следовательно, повторение и добавление может и приведет к значительному снижению производительности. Для получения дополнительной информации см: pandas.pydata.org/pandas-docs/stable/merging.htmlПравильный путь ™ для создания DataFrame
Большинство ответов здесь расскажут вам, как создать пустой DataFrame и заполнить его, но никто не скажет вам, что это плохо.
Вот мой совет: подождите, пока вы не убедитесь, что у вас есть все данные, с которыми вам нужно работать. Используйте список для сбора ваших данных, затем инициализируйте DataFrame, когда будете готовы.
Это всегда дешевле , чтобы добавить в список и создать DataFrame на одном дыхании , чем это , чтобы создать пустой DataFrame (или один из из NaNs) и дополнения к нему снова и снова. Списки также занимают меньше памяти и представляют собой гораздо более легкую структуру данных для работы , добавления и удаления (при необходимости).
Другое преимущество этого метода заключается в том, что
dtypes
они автоматически выводятся (а не присваиваютсяobject
всем).Последнее преимущество заключается в том, что для ваших данных автоматически создается a
RangeIndex
, так что беспокоиться об этом будет меньше (взгляните на плохие методыappend
иloc
методы ниже, вы увидите элементы в обоих, которые требуют соответствующей обработки индекса).То, что вы не должны делать
append
илиconcat
внутри циклаВот самая большая ошибка, которую я видел от новичков:
Память перераспределена для каждых
append
илиconcat
операций у вас есть. Соедините это с циклом, и вы получите квадратичную операцию сложности . Соdf.append
страницы документа :Другая ошибка, связанная с этим,
df.append
заключается в том, что пользователи, как правило, забывают, что добавление не является функцией на месте , поэтому результат должен быть возвращен обратно. Вы также должны беспокоиться о dtypes:Работа со столбцами объекта никогда не бывает хорошей, потому что pandas не может векторизовать операции над этими столбцами. Вам нужно будет сделать это, чтобы это исправить:
loc
внутри петлиЯ также видел, как
loc
используется для добавления в DataFrame, который был создан пустым:Как и раньше, вы не выделяете заранее необходимый объем памяти каждый раз, поэтому объем памяти увеличивается каждый раз, когда вы создаете новую строку . Это так же плохо, как
append
и даже более уродливо.Пустой фрейм данных NaNs
И затем, создается DataFrame из NaN и все связанные с этим предостережения.
Он создает DataFrame столбцов объекта, как и другие.
В приложении есть все вопросы, описанные выше.
Доказательство в пудинге
Сроки этих методов - самый быстрый способ узнать, насколько они различаются с точки зрения их памяти и полезности.
Контрольный код для справки.
источник
Инициализировать пустой кадр с именами столбцов
Добавить новую запись в кадр
Вы также можете передать словарь:
Добавить еще один кадр в ваш существующий кадр
Вопросы производительности
Если вы добавляете строки в цикл, учитывайте проблемы с производительностью. Примерно для первых 1000 записей «my_df.loc» производительность лучше, но постепенно она становится медленнее с увеличением количества записей в цикле.
Если вы планируете делать что-то внутри большого цикла (скажем, 10 миллионов записей или около того), вам лучше использовать смесь этих двух; заполняйте фрейм данных iloc, пока размер не достигнет 1000, затем добавьте его к исходному фрейму данных и очистите временный фрейм данных. Это повысит вашу производительность примерно в 10 раз.
источник
my_df = my_df.append(my_df2)
у меня не работает, если я не укажуignore_index=True
.Предположим, датафрейм с 19 строками
Сохранение столбца А в качестве константы
Сохранение столбца b как переменной, заданной циклом
Вы можете заменить первый х в
pd.Series([x], index = [x])
с любым значениемисточник