14

Создание DataFrame в Pandas путём последовательного добавления строк

13

Как создать пустой DataFrame в Pandas и добавлять строки по одной?

Я создал пустой DataFrame:

df = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))

Затем я могу добавить новую строку в конец и заполнить одно поле следующим образом:

df = df._set_value(index=len(df), col='qty1', value=10.0)

Однако этот метод позволяет заполнять только одно поле за раз. Какой лучший способ добавить новую строку в df?

5 ответ(ов)

9

Вы можете использовать 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

Таким образом, вы можете динамически добавлять строки в ваш датафрейм, используя подходящий индекс для каждой строки.

8

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

  1. Создайте список словарей, где каждый словарь соответствует одной строке входных данных.
  2. Создайте DataFrame из этого списка.

Я сталкивался с аналогичной задачей, где добавление строк в DataFrame по одному заняло 30 минут, в то время как создание DataFrame из списка словарей завершилось за считанные секунды.

Вот пример кода:

rows_list = []
for row in input_rows:
    dict1 = {}
    # Получаем входные данные в формате словаря
    # ключ = имя колонки
    dict1.update(blah..) 

    rows_list.append(dict1)

df = pd.DataFrame(rows_list)               

Этот метод значительно эффективнее, особенно при работе с большими объемами данных.

1

Если вы заранее знаете количество записей, вам стоит заранее выделить память, указав индекс (используя приведённый в другом ответе пример данных):

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 с.

0

Ваш код создает DataFrame с заданными столбцами и добавляет строки в цикле. Вот как он работает:

  1. Вы создаете список mycolumns, который содержит названия колонок 'A' и 'B'.
  2. Затем создаете пустой DataFrame df с этими колонками.
  3. После этого у вас есть список rows, содержащий подсписки, которые вы хотите добавить в DataFrame.
  4. В цикле 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 сразу, без необходимости добавлять строки по одной.

0

Вы можете добавить одну строку в 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 с добавленной строкой, так что не забудьте присвоить результат обратно в переменную.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь