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