Использование pandas .append внутри цикла for

Я добавляю строки в pandas DataFrame в цикле for, но в конце фреймворк всегда пуст. Я не хочу добавлять строки в массив, а затем вызывать конструктор DataFrame, потому что мой фактический цикл for обрабатывает множество данных. Я также пробовал pd.concat без успеха. Может ли кто-нибудь выделить то, что мне не хватает, чтобы заставить заявление append работать? Вот фиктивный пример:

 import pandas as pd import numpy as np data = pd.DataFrame([]) for i in np.arange(0, 4): if i % 2 == 0: data.append(pd.DataFrame({'A': i, 'B': i + 1}, index=[0]), ignore_index=True) else: data.append(pd.DataFrame({'A': i}, index=[0]), ignore_index=True) print data.head() Empty DataFrame Columns: [] Index: [] [Finished in 0.676s] 

3 Solutions collect form web for “Использование pandas .append внутри цикла for”

Вам нужно установить переменные data равными прилагаемому фрейму данных. В отличие от метода append в списке python, приложение pandas не происходит на месте

 import pandas as pd import numpy as np data = pd.DataFrame([]) for i in np.arange(0, 4): if i % 2 == 0: data = data.append(pd.DataFrame({'A': i, 'B': i + 1}, index=[0]), ignore_index=True) else: data = data.append(pd.DataFrame({'A': i}, index=[0]), ignore_index=True) print(data.head()) AB 0 0 1.0 1 2 3.0 2 3 NaN 

Каждый раз, когда вы вызываете append, Pandas возвращает копию исходного фрейма и новую строку. Это называется квадратичной копией, и это операция O (N ^ 2), которая быстро станет очень медленной (особенно потому, что у вас много данных).

В вашем случае я бы рекомендовал использовать списки, добавить к ним, а затем вызвать конструктор dataframe.

 a_list = [] b_list = [] for data in my_data: a, b = process_data(data) a_list.append(a) b_list.append(b) df = pd.DataFrame({'A': a_list, 'B': b_list}) del a_list, b_list 

Задержки

 %%timeit data = pd.DataFrame([]) for i in np.arange(0, 10000): if i % 2 == 0: data = data.append(pd.DataFrame({'A': i, 'B': i + 1}, index=[0]), ignore_index=True) else: data = data.append(pd.DataFrame({'A': i}, index=[0]), ignore_index=True) 1 loops, best of 3: 6.8 s per loop %%timeit a_list = [] b_list = [] for i in np.arange(0, 10000): if i % 2 == 0: a_list.append(i) b_list.append(i + 1) else: a_list.append(i) b_list.append(None) data = pd.DataFrame({'A': a_list, 'B': b_list}) 100 loops, best of 3: 8.54 ms per loop 

Вы можете построить свою фреймворк без цикла:

 n = 4 data = pd.DataFrame({'A': np.arange(n)}) data['B'] = np.NaN data.loc[data['A'] % 2 == 0, 'B'] = data['A'] + 1 

Для:

 n = 10000 

Это немного быстрее:

 %%timeit data = pd.DataFrame({'A': np.arange(n)}) data['B'] = np.NaN data.loc[data['A'] % 2 == 0, 'B'] = data['A'] + 1 100 loops, best of 3: 3.3 ms per loop 

против

 %%timeit a_list = [] b_list = [] for i in np.arange(n): if i % 2 == 0: a_list.append(i) b_list.append(i + 1) else: a_list.append(i) b_list.append(None) data1 = pd.DataFrame({'A': a_list, 'B': b_list}) 100 loops, best of 3: 12.4 ms per loop 
  • Замена значения NaN словом, когда NaN не повторяется в двух последовательных строках
  • Применить функцию ко второму столбцу в pandas dataframe groupby
  • Обеспечение правильного порядка операций в случайной классификации лесов в scikit learn
  • Сбросить столбцы Уровни MultiIndex
  • Определение интервалов уверенности и прогнозирования с повторными вводами
  • Как получить количество групп в объекте groupby в пандах?
  • Панды применяются, но только для строк, где выполняется условие
  • Создание Pandas Dataframe между двумя массивами Numpy, затем нарисуйте график разброса
  • Агрегация Pandas OHLC по данным OHLC
  • Pandas - Заменить значения в DataFrame на основе Boollean DataFrame
  • Удаление пространства в python dataframe
  • Python - лучший язык программирования в мире.