Создание DataFrame в Pandas путём последовательного добавления строк
Как создать пустой DataFrame
в Pandas и добавлять строки по одной?
Я создал пустой DataFrame
:
df = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))
Затем я могу добавить новую строку в конец и заполнить одно поле следующим образом:
df = df._set_value(index=len(df), col='qty1', value=10.0)
Однако этот метод позволяет заполнять только одно поле за раз. Какой лучший способ добавить новую строку в df
?
5 ответ(ов)
Вы можете использовать df.loc[i]
, где строка с индексом i
будет содержать те значения, которые вы зададите в датафрейме.
>>> import pandas as pd
>>> from numpy.random import randint
>>> df = pd.DataFrame(columns=['lib', 'qty1', 'qty2'])
>>> for i in range(5):
>>> df.loc[i] = ['name' + str(i)] + list(randint(10, size=2))
>>> df
lib qty1 qty2
0 name0 3 3
1 name1 2 4
2 name2 2 8
3 name3 2 1
4 name4 9 6
Таким образом, вы можете динамически добавлять строки в ваш датафрейм, используя подходящий индекс для каждой строки.
Если вы можете получить все данные для DataFrame заранее, есть гораздо более быстрый способ, чем поочередное добавление строк в DataFrame:
- Создайте список словарей, где каждый словарь соответствует одной строке входных данных.
- Создайте DataFrame из этого списка.
Я сталкивался с аналогичной задачей, где добавление строк в DataFrame по одному заняло 30 минут, в то время как создание DataFrame из списка словарей завершилось за считанные секунды.
Вот пример кода:
rows_list = []
for row in input_rows:
dict1 = {}
# Получаем входные данные в формате словаря
# ключ = имя колонки
dict1.update(blah..)
rows_list.append(dict1)
df = pd.DataFrame(rows_list)
Этот метод значительно эффективнее, особенно при работе с большими объемами данных.
Если вы заранее знаете количество записей, вам стоит заранее выделить память, указав индекс (используя приведённый в другом ответе пример данных):
import pandas as pd
import numpy as np
# мы знаем, что у нас будет 5 строк данных
numberOfRows = 5
# создаем DataFrame
df = pd.DataFrame(index=np.arange(0, numberOfRows), columns=('lib', 'qty1', 'qty2'))
# теперь заполняем его построчно
for x in np.arange(0, numberOfRows):
# loc или iloc подходят, так как индекс - это натуральные числа
df.loc[x] = [np.random.randint(-1, 1) for n in range(3)]
In[23]: df
Out[23]:
lib qty1 qty2
0 -1 -1 -1
1 0 0 0
2 -1 0 -1
3 0 -1 0
4 -1 0 0
Сравнение скорости
In[30]: %timeit tryThis() # обертка функции для этого ответа
In[31]: %timeit tryOther() # обертка функции без указания индекса (см., например, @fred)
1000 loops, best of 3: 1.23 ms per loop
100 loops, best of 3: 2.31 ms per loop
И как отмечалось в комментариях, при размере 6000 разница в скорости становится еще более значительной:
Увеличение размера массива (12) и количества строк (500) делает разницу в скорости более заметной: 313 мс против 2.29 с.
Ваш код создает DataFrame с заданными столбцами и добавляет строки в цикле. Вот как он работает:
- Вы создаете список
mycolumns
, который содержит названия колонок 'A' и 'B'. - Затем создаете пустой DataFrame
df
с этими колонками. - После этого у вас есть список
rows
, содержащий подсписки, которые вы хотите добавить в DataFrame. - В цикле
for
вы добавляете каждую строку в DataFrame, используяdf.loc[len(df)]
, что добавляет новую строку в конец.
Однако стоит отметить, что использование df.loc[len(df)]
для добавления строк в DataFrame может быть неэффективным, особенно для больших данных. Предпочтительнее будет использовать метод pd.DataFrame
для создания DataFrame сразу из списка строк или методы, такие как df.append()
или pd.concat()
после создания всех строк.
Вот пример, как можно улучшить ваш код:
import pandas as pd
mycolumns = ['A', 'B']
rows = [[1, 2], [3, 4], [5, 6]]
# Создаем DataFrame сразу из списка
df = pd.DataFrame(rows, columns=mycolumns)
Таким образом, вы создадите DataFrame сразу, без необходимости добавлять строки по одной.
Вы можете добавить одну строку в DataFrame в виде словаря, используя опцию ignore_index
.
Вот пример:
import pandas as pd
f = pd.DataFrame(data={'Animal': ['cow', 'horse'], 'Color': ['blue', 'red']})
print(f)
Этот код создаст следующий DataFrame:
Animal Color
0 cow blue
1 horse red
Чтобы добавить новую строку с данными о животном "mouse" и цвете "black", используйте метод append
с параметром ignore_index=True
:
f = f.append({'Animal': 'mouse', 'Color': 'black'}, ignore_index=True)
print(f)
В результате вы получите такой DataFrame:
Animal Color
0 cow blue
1 horse red
2 mouse black
Обратите внимание, что метод append
возвращает новый DataFrame с добавленной строкой, так что не забудьте присвоить результат обратно в переменную.
Переименование названий столбцов в Pandas
"Красивая печать всей Series / DataFrame в Pandas"
Запись DataFrame pandas в CSV файл
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas