manejo filtrar datos data crear como python dataframe pandas

filtrar - crear dataframe python



¿Creando un Pandas DataFrame vacío, y luego llenándolo? (4)

Estoy comenzando desde los documentos de Marco de datos de pandas aquí: http://pandas.pydata.org/pandas-docs/stable/dsintro.html

Me gustaría rellenar iterativamente el Marco de datos con valores en una clase de tiempo de cálculo. Básicamente, me gustaría inicializar, el marco de datos con las columnas A, B y las filas de marca de tiempo, todas 0 o todas NaN.

Luego agregaría valores iniciales y repasaría estos datos calculando la nueva fila de la fila anterior, digamos fila [A] [t] = fila [A] [t-1] +1 o algo así.

Actualmente estoy usando el código como se muestra a continuación, pero creo que es algo feo y debe haber una forma de hacerlo directamente con un marco de datos o simplemente de una manera mejor en general. Nota: estoy usando Python 2.7.

import datetime as dt import pandas as pd import scipy as s if __name__ == ''__main__'': base = dt.datetime.today().date() dates = [ base - dt.timedelta(days=x) for x in range(0,10) ] dates.sort() valdict = {} symbols = [''A'',''B'', ''C''] for symb in symbols: valdict[symb] = pd.Series( s.zeros( len(dates)), dates ) for thedate in dates: if thedate > dates[0]: for symb in valdict: valdict[symb][thedate] = 1+valdict[symb][thedate - dt.timedelta(days=1)] print valdict


Aquí hay un par de sugerencias:

Use date_range para el índice:

import datetime import pandas as pd import numpy as np todays_date = datetime.datetime.now().date() index = pd.date_range(todays_date-datetime.timedelta(10), periods=10, freq=''D'') columns = [''A'',''B'', ''C'']

Nota: podríamos crear un DataFrame vacío (con NaN s) simplemente escribiendo:

df_ = pd.DataFrame(index=index, columns=columns) df_ = df_.fillna(0) # with 0s rather than NaNs

Para hacer este tipo de cálculos para los datos, use una matriz numpy:

data = np.array([np.arange(10)]*3).T

Por lo tanto podemos crear el DataFrame:

In [10]: df = pd.DataFrame(data, index=index, columns=columns) In [11]: df Out[11]: A B C 2012-11-29 0 0 0 2012-11-30 1 1 1 2012-12-01 2 2 2 2012-12-02 3 3 3 2012-12-03 4 4 4 2012-12-04 5 5 5 2012-12-05 6 6 6 2012-12-06 7 7 7 2012-12-07 8 8 8 2012-12-08 9 9 9


Supongamos un marco de datos con 19 filas

index=range(0,19) index columns=[''A''] test = pd.DataFrame(index=index, columns=columns)

Mantener la columna A como una constante

test[''A'']=10

Mantener la columna b como una variable dada por un bucle.

for x in range(0,19): test.loc[[x], ''b''] = pd.Series([x], index = [x])

Puede reemplazar la primera x en pd.Series ([x], index = [x]) con cualquier valor


Si desea que los nombres de sus columnas estén en su lugar desde el principio, utilice este enfoque:

import pandas as pd col_names = [''A'', ''B'', ''C''] my_df = pd.DataFrame(columns = col_names) my_df

Si desea agregar un registro al marco de datos, sería mejor usar:

my_df.loc[len(my_df)] = [2, 4, 5]

También es posible que desee pasar un diccionario:

my_dic = {''A'':2, ''B'':4, ''C'':5} my_df.loc[len(my_df)] = my_dic

Sin embargo, si desea agregar otro marco de datos a my_df, haga lo siguiente:

col_names = [''A'', ''B'', ''C''] my_df2 = pd.DataFrame(columns = col_names) my_df = my_df.append(my_df2)

si está agregando filas dentro de un bucle, tenga en cuenta los problemas de rendimiento;
para alrededor de los primeros 1000 registros el rendimiento de "my_df.loc" es mejor y, gradualmente, se vuelve más lento al aumentar el número de registros en bucle.

Si planea hacer cosas dentro de un gran bucle (digamos 10M‌ registros aproximadamente)
es mejor usar una mezcla de estos dos; rellene un marco de datos con iloc hasta que el tamaño llegue a 1000, luego agréguelo al marco de datos original y vacíe el marco de datos temporal. Esto aumentaría tu rendimiento alrededor de 10 veces.


Si simplemente desea crear un marco de datos vacío y llenarlo con algunos marcos de datos entrantes más adelante, intente esto:

En este ejemplo, estoy usando este documento de pandas para crear un nuevo marco de datos y luego uso la función de append para escribir en el nuevoDF con datos de oldDF.

Echa un vistazo a esto

newDF = pd.DataFrame() #creates a new dataframe that''s empty newDF = newDF.append(oldDF, ignore_index = True) # ignoring index is optional # try printing some data from newDF print newDF.head() #again optional

  • Si tengo que seguir agregando datos nuevos a este nuevo archivo de archivo de más de un archivo de archivos antiguos, solo uso un bucle for para iterar sobre append