Я понимаю, что pandas предназначен для загрузки полностью заполненных, DataFrame
но мне нужно создать пустой DataFrame, а затем добавить строки, одну за другой . Каков наилучший способ сделать это?
Я успешно создал пустой DataFrame с:
res = DataFrame(columns=('lib', 'qty1', 'qty2'))
Затем я могу добавить новую строку и заполнить поле:
res = res.set_value(len(res), 'qty1', 10.0)
Это работает, но кажется очень странным: - / (не удается добавить строковое значение)
Как я могу добавить новую строку в мой DataFrame (с другим типом столбцов)?
Ответы:
Вы можете использовать
df.loc[i]
, где строка с индексомi
будет такой, какой вы указываете ее в кадре данных.источник
.loc
ссылается на столбец индекса, поэтому, если вы работаете с существующим ранее DataFrame с индексом, который не является непрерывной последовательностью целых чисел, начинающейся с 0 (как в вашем примере),.loc
перезапишет существующие строки или вставит строки, или создать пробелы в вашем индексе. Более надежным (но не надежным) подходом для добавления существующегоdf.loc[df.index.max() + 1] = [randint(...
кадра данных ненулевой длины будет: или предварительное заполнение индекса, как предложено @FooBar.df.index.max()
- этоnan
когда DataFrame пуст.df.loc[0 if pd.isnull(df.index.max()) else df.index.max() + 1]
В случае, если вы можете получить все данные для фрейма данных заранее, существует гораздо более быстрый подход, чем добавление фрейма данных:
У меня была похожая задача, для которой добавление строки данных за строкой занимало 30 минут, а создание кадра данных из списка словарей выполнялось за считанные секунды.
источник
It is worth noting however, that concat (and therefore append) makes a full copy of the data, and that constantly reusing this function can create a significant performance hit. If you need to use the operation over several datasets, use a list comprehension.
( pandas.pydata.org/pandas-docs/stable/… )Вы можете использовать
pandas.concat()
илиDataFrame.append()
. Подробности и примеры см. В разделе « Объединение, объединение и объединение» .источник
.loc
механизма, которого можно избежать, особенно если вы осторожны.DataFrame.append()
, вы должны удостовериться, что ваши данные строк - это прежде всего DataFrame, а не список.Это было давно, но я столкнулся с той же проблемой. И нашел здесь много интересных ответов. Поэтому я запутался, какой метод использовать.
В случае добавления большого количества строк в фрейм данных я заинтересован в быстродействии . Итак, я попробовал 4 самых популярных метода и проверил их скорость.
ОБНОВЛЕНО в 2019 году с использованием новых версий пакетов. Также обновляется после комментария @FooBar
СКОРОСТЬ
Результаты (в секундах):
Также спасибо @krassowski за полезный комментарий - я обновил код.
Поэтому я использую дополнение через словарь для себя.
Код:
PS Я считаю, что моя реализация не идеальна, и, возможно, есть некоторая оптимизация.
источник
df2.index.max()
for.loc
без необходимости увеличивает вычислительную сложность. Простоеdf2.loc[i] = ...
сделало бы. Для меня это сократило время с 10 секунд до 8,64 секундЕсли вы знаете количество записей ex ante, вам следует предварительно выделить место, указав также индекс (взяв пример данных из другого ответа):
Сравнение скорости
И - как видно из комментариев - при размере 6000 разница в скорости становится еще больше:
источник
источник
Для эффективного добавления см. Как добавить дополнительную строку в фрейм данных pandas и Настройка с расширением .
Добавьте строки
loc/ix
в несуществующие данные индекса ключа. например:Или:
источник
Вы можете добавить одну строку в качестве словаря, используя
ignore_index
опцию.источник
f.append(<stuff>)
создаете новый объект, а не просто добавляете его к текущему объекту на месте, поэтому, если вы пытаетесь добавить к фрейму данных в сценарии, вам нужно сказатьf = f.append(<stuff>)
Ради пути Pythonic, здесь добавьте мой ответ:
источник
Вы также можете создать список списков и преобразовать его в фрейм данных -
дающий
источник
Это не ответ на вопрос ОП, а игрушечный пример, иллюстрирующий ответ @ShikharDua, который я нашел очень полезным.
Хотя этот фрагмент тривиален, в реальных данных у меня было 1000 строк и много столбцов, и я хотел иметь возможность группировать по разным столбцам, а затем выполнять приведенную ниже статистику для более чем одного столбца тега. Таким образом, наличие надежного метода построения фрейма данных по одной строке за раз было большим удобством. Спасибо @ShikharDua!
источник
Выяснил простой и приятный способ:
источник
Вы можете использовать генератор объекта для создания Dataframe, который будет более эффективным в использовании памяти по списку.
Чтобы добавить raw в существующий DataFrame, вы можете использовать метод append.
источник
Создайте новую запись (фрейм данных) и добавьте в old_data_frame .
передать список значений и имена соответствующих столбцов, чтобы создать новую запись (data_frame)
источник
Вот способ добавить / добавить строку в
pandas DataFrame
Может использоваться для вставки / добавления строки в пустые или заполненные панды DataFrame
источник
Вместо списка словарей, как в ответе Шикхардуа, мы также можем представить нашу таблицу в виде словаря списков , где каждый список хранит один столбец в порядке строк, если мы заранее знаем наши столбцы. В конце мы создаем наш DataFrame один раз.
Для столбцов c и n строк используется 1 словарь и c списков, а не 1 список и n словарей. В методе списка словарей каждый словарь хранит все ключи и требует создания нового словаря для каждой строки. Здесь мы только добавляем к спискам, что является постоянным временем и теоретически очень быстро.
источник
если вы хотите добавить строку в конце, добавьте его в список
источник
Другой способ сделать это (вероятно, не очень производительный):
Вы также можете улучшить класс DataFrame следующим образом:
источник
Все, что вам нужно, это
loc[df.shape[0]]
илиloc[len(df)]
или
источник
Сделай это проще. Принимая список в качестве входных данных, который будет добавлен как строка в фрейме данных: -
источник
Мы часто видим конструкцию,
df.loc[subscript] = …
присваиваемую одной строке DataFrame. Mikhail_Sam опубликовал тесты, содержащие, помимо прочего, эту конструкцию, а также метод, использующий dict и, в конце, создающий DataFrame . Он нашел последний самый быстрый на сегодняшний день. Но если мы заменимdf3.loc[i] = …
(с предварительно выделенным DataFrame) в его коде наdf3.values[i] = …
, результат значительно изменится, так как этот метод будет работать аналогично тому, который использует dict. Поэтому мы должны чаще принимать во внимание использованиеdf.values[subscript] = …
. Тем не менее, обратите внимание, что.values
требуется нулевой индекс, который может отличаться от DataFrame.index.источник
# .loc with prealloc
), другой пример в вопросе. Мне нужно сравнить данные из каждой строки в Pandas DataFrame с данными из остальных строк, есть ли способ ускорить вычисления ? и его принятый ответ.pandas.DataFrame.append
DataFrame.append (self, other, ignore_index = False, verify_integrity = False, sort = False) → 'DataFrame'
Если для ignore_index установлено значение True:
источник
перед тем как добавить строку, мы должны преобразовать фрейм данных в словарь, где вы можете видеть ключи как столбцы в фрейме данных, а значения столбцов снова сохраняются в словаре, но ключом для каждого столбца является номер индекса в фрейме данных. Эта идея заставляет меня написать код ниже.
источник
Вы можете объединить два DataFrames для этого. Я в основном сталкивался с этой проблемой, чтобы добавить новую строку в существующий DataFrame с индексом символов (не числовым). Итак, я ввожу данные для новой строки в duct () и индекс в списке.
источник
Это позаботится о добавлении элемента в пустой DataFrame. Проблема в том, что
df.index.max() == nan
для первого индекса:источник