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