python pandas append concat

python - Usando pandas.append dentro de for loop



concat (3)

Cada vez que llama anexar, Pandas le devuelve una copia del marco de datos original más su nueva fila. Esto se llama copia cuadrática, y es una operación O (N ^ 2) que rápidamente se volverá muy lenta (especialmente porque tiene muchos datos).

En su caso, recomendaría usar listas, agregarlas y luego llamar al constructor de marcos de datos.

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

Tiempos

%%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

Estoy agregando filas a un DataFrame de pandas dentro de un bucle for, pero al final el marco de datos siempre está vacío. No quiero agregar las filas a una matriz y luego llamar al constructor DataFrame, porque mi bucle for real maneja muchos datos. También probé pd.concat sin éxito. ¿Podría alguien resaltar lo que me falta para que la declaración de anexos funcione? Aquí hay un ejemplo ficticio:

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]


Debe establecer los data variables igual al marco de datos adjunto. A diferencia del método append en una lista de python, el append pandas no ocurre en su lugar

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()) A B 0 0 1.0 1 2 3.0 2 3 NaN


Puede construir su marco de datos sin un bucle:

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

Por:

n = 10000

Esto es un poco más rápido:

%%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

vs.

%%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