Pandas La navaja suiza para tus datos, Parte 2

Esta es la segunda parte de un tutorial de dos partes sobre Pandas, el increíble conjunto de herramientas de análisis de datos de Python.. 

En la primera parte, cubrimos los tipos de datos básicos de Pandas: la serie y el marco de datos. Importamos y exportamos datos, seleccionamos subconjuntos de datos, trabajamos con metadatos y ordenamos los datos. 

En esta parte, continuaremos nuestro viaje y trataremos los datos faltantes, la manipulación de datos, la fusión de datos, la agrupación de datos, las series de tiempo y el trazado..

Tratar con los valores perdidos

Uno de los puntos más fuertes de los pandas es su manejo de los valores perdidos. No solo se bloqueará y se quemará en la presencia de datos faltantes. Cuando faltan datos, los pandas los reemplazan con numpy's np.nan (no es un número) y no participa en ningún cálculo..

Vamos a reindexar nuestro marco de datos, agregando más filas y columnas, pero sin ningún dato nuevo. Para hacerlo interesante, poblaremos algunos valores..

>>> df = pd.DataFrame (np.random.randn (5,2), índice = índice, columnas = ['a', 'b']) >>> new_index = df.index.append (pd.Index (['six'])) >>> new_columns = list (df.columns) + ['c'] >>> df = df.reindex (index = new_index, columns = new_columns) >>> df.loc [' tres ']. c = 3 >>> df.loc [' cuatro ']. c = 4 >>> df abc one -0.042172 0.374922 NaN dos -0.689523 1.411403 NaN tres 0.332707 0.307561 3.0 cuatro 0.426519 -0.425181 4.0 cinco -0.161095 - 0.849932 NaN seis NaN NaN NaN 

Tenga en cuenta que df.index.append () devuelve un nuevo índice y no modifica el índice existente. también, df.reindex () devuelve un nuevo Marco de datos que asigno de nuevo a la df variable.

En este punto, nuestro marco de datos tiene seis filas. La última fila es todas las NaN, y todas las demás filas excepto la tercera y la cuarta tienen NaN en la columna "c". ¿Qué puedes hacer con los datos que faltan? Aquí están las opciones:

  • Guárdelo (pero no participará en los cálculos).
  • Suéltelo (el resultado del cálculo no contendrá los datos faltantes).
  • Reemplácelo con un valor predeterminado.
Mantenga los datos faltantes --------------------- >>> df * = 2 >>> df abc one -0.084345 0.749845 NaN two -1.379046 2.822806 NaN three 0.665414 0.615123 6.0 cuatro 0.853037 -0.850362 8.0 cinco -0.322190 -1.699864 NaN seis NaN NaN NaN Eliminar filas con datos faltantes --------------------------- >> > df.dropna () abc tres 0.665414 0.615123 6.0 cuatro 0.853037 -0.850362 8.0 Reemplazar con el valor predeterminado -------------------------- >>> df .fillna (5) abc one -0.084345 0.749845 5.0 dos -1.379046 2.822806 5.0 tres 0.665414 0.615123 6.0 cuatro 0.853037 -0.850362 8.0 cinco -0.322190 -1.699864 5.0 seis 5.000000 5.000000 5.0 

Si solo desea comprobar si faltan datos en su marco de datos, use la es nulo() método. Esto devuelve una máscara booleana de su marco de datos, que es Cierto por valores perdidos y Falso en otra parte.

>>> df.isnull () a b c one Falso False True dos False False True tres Falso False False cuatro Falso Falso Falso cinco Falso Falso Verdadero seis Verdadero Verdadero Verdadero

Manipulando sus datos

Cuando tiene un marco de datos, a menudo necesita realizar operaciones en los datos. Comencemos con un nuevo marco de datos que tiene cuatro filas y tres columnas de enteros aleatorios entre 1 y 9 (inclusive).

>>> df = pd.DataFrame (np.random.randint (1, 10, tamaño = (4, 3)), columnas = ['a', 'b', 'c']) >>> df abc 0 1 3 3 1 8 9 2 2 8 1 5 3 4 6 1 

Ahora, puedes empezar a trabajar en los datos. Resumamos todas las columnas y asignemos el resultado a la última fila, y luego sumemos todas las filas (dimensión 1) y asignamos a la última columna:

>>> df.loc [3] = df.sum () >>> df abc 0 1 3 3 1 8 9 2 2 8 1 5 3 21 19 11 >>> df.c = df.sum (1)> >> df abc 0 1 3 7 1 8 9 19 2 8 1 14 3 21 19 51 

También puede realizar operaciones en todo el marco de datos. Aquí hay un ejemplo de restar 3 de cada celda:

>>> df - = 3 >>> df a b c 0 -2 0 4 1 5 6 16 2 5 -2 11 3 18 16 48 

Para el control total, puede aplicar funciones arbitrarias:

>>> df.apply (lambda x: x ** 2 + 5 * x - 4) a b c 0 -10 -4 32 1 46 62 332 2 46 -10 172 3 410 332 2540

Fusión de datos

Otro escenario común cuando se trabaja con marcos de datos es combinar y combinar marcos de datos (y series) juntos. Las pandas, como siempre, te dan diferentes opciones. Vamos a crear otro marco de datos y explorar las diferentes opciones..

>>> df2 = df // 3 >>> df2 a b c 0 -1 0 1 1 1 2 5 2 1 -1 3 3 6 5 16

Concat

Cuando se usa pd.concat, los pandas simplemente concatenan todas las filas de las partes provistas en orden. No hay alineación de índices. Vea en el siguiente ejemplo cómo se crean valores de índice duplicados:

>>> pd.concat ([df, df2]) a b c 0 -2 0 4 1 5 6 16 2 5 -2 11 3 18 16 48 0 -1 1 1 2 2 2 -1 -1 3 3 6 5 16 

También puede concatenar columnas utilizando el eje = 1 argumento:

>>> pd.concat ([df [: 2], df2], axis = 1) abcabc 0 -2.0 0.0 4.0 -1 0 1 1 5.0 6.0 16.0 1 2 5 2 NaN NaN NaN 1 -1 3 3 NaN NaN NaN 6 5 16 

Tenga en cuenta que debido a que el primer marco de datos (solo usé dos filas) no tenía tantas filas, los valores faltantes se rellenaron automáticamente con NaN, lo que cambió esos tipos de columna de int a float.

Es posible concatenar cualquier número de marcos de datos en una llamada.

Unir

La función de fusión se comporta de manera similar a la unión a SQL. Fusiona todas las columnas de las filas que tienen claves similares. Tenga en cuenta que opera solo en dos marcos de datos:

>>> df = pd.DataFrame (dict (key = ['start', 'finish'], x = [4, 8])) >>> df key x 0 start 4 1 finish 8 >>> df2 = pd .DataFrame (dict (key = ['start', 'finish'], y = [2, 18])) >>> df2 key y 0 start 2 1 finish 18 >>> pd.merge (df, df2, on = "clave") tecla xy 0 inicio 4 2 1 final 8 18

Adjuntar

El marco de datos adjuntar() El método es un pequeño atajo. Se comporta funcionalmente como concat (), pero guarda algunos golpes de tecla.

>>> df key x 0 start 4 1 finish 8 Anexando una fila usando el método de adición () ----------------------------- -------------- >>> df.append (dict (key = 'middle', x = 9), ignore_index = True) key x 0 start 4 1 finish 8 2 middle 9 Appending una fila usando el concat () ------------------------------------------- >>> pd.concat ([df, pd.DataFrame (dict (key = 'middle', x = [9]))], ignore_index = True) key x 0 start 4 1 finish 8 2 middle 9

Agrupando tus datos

Aquí hay un marco de datos que contiene los miembros y las edades de dos familias: los Smith y los Jones. Puedes usar el agrupar por() método para agrupar los datos por apellido y encontrar información a nivel familiar como la suma de las edades y la edad media:

df = pd.DataFrame (dict (primero = 'John Jim Jenny Jill Jack'.split (), último = "Smith Jones Jones Smith Smith" .split (), age = [11, 13, 22, 44, 65]) ) >>> df.groupby ('último'). suma () edad último Jones 35 Smith 120 >>> df.groupby ('último'). media () edad último Jones 17.5 Smith 40.0 

Series de tiempo

Una gran cantidad de datos importantes son datos de series de tiempo. Pandas tiene un sólido soporte para los datos de series de tiempo que comienzan con rangos de datos, pasando por la localización y la conversión de tiempo, y hasta el muestreo sofisticado basado en la frecuencia..

los rango de fechas() La función puede generar secuencias de tiempos de datos. Este es un ejemplo de cómo generar un período de seis semanas a partir del 1 de enero de 2017 usando la zona horaria UTC.

>>> semanas = pd.date_range (inicio = '1/1/2017', periodos = 6, freq = "W", tz = "UTC") >>> semanas DatetimeIndex (['2017-01-01', '2017-01-08', '2017-01-15', '2017-01-22', '2017-01-29', '2017-02-05'], dtype = "datetime64 [ns, UTC] ", freq =" W-SUN ")

Agregar una marca de tiempo a sus marcos de datos, ya sea como columna de datos o como índice, es excelente para organizar y agrupar sus datos por tiempo. También permite remuestrear. Aquí hay un ejemplo de remuestreo de datos de cada minuto como agregaciones de cinco minutos.

>>> minutos = pd.date_range (inicio = '1/1/2017', periodos = 10, freq = "1Min", tz = "UTC") >>> ts = pd.Series (np.random.randn ( len (minutos)), minutos) >>> ts 2017-01-01 00: 00: 00 + 00: 00 1.866913 2017-01-01 00: 01: 00 + 00: 00 2.157201 2017-01-01 00:02 : 00 + 00: 00 -0.439932 2017-01-01 00: 03: 00 + 00: 00 0.777944 2017-01-01 00: 04: 00 + 00: 00 0.755624 2017-01-01 00: 05: 00 + 00 : 00 -2.150276 2017-01-01 00: 06: 00 + 00: 00 3.352880 2017-01-01 00: 07: 00 + 00: 00 -1.657432 2017-01-01 00: 08: 00 + 00: 00 - 0.144666 2017-01-01 00: 09: 00 + 00: 00 -0.667059 Freq: T, dtype: float64 >>> ts.resample ('5Min'). Mean () 2017-01-01 00: 00: 00+ 00:00 1.023550 2017-01-01 00: 05: 00 + 00: 00 -0.253311

Trazar

Pandas soporta el trazado con matplotlib. Asegúrese de que está instalado: pip instalar matplotlib. Para generar una trama, puedes llamar al trama() de una serie o un marco de datos. Hay muchas opciones para controlar la trama, pero los valores predeterminados funcionan con propósitos de visualización simples. Aquí es cómo generar un gráfico de líneas y guardarlo en un archivo PDF.

ts = pd.Series (np.random.randn (1000), index = pd.date_range ('1/1/2017', periodos = 1000)) ts = ts.cumsum () ax = ts.plot () fig = ax.get_figure () fig.savefig ('plot.pdf')

Tenga en cuenta que en macOS, Python debe instalarse como un marco para trazar con Pandas.

Conclusión

Pandas es un marco de análisis de datos muy amplio. Tiene un modelo de objeto simple con los conceptos de serie y marco de datos y una gran cantidad de funcionalidades incorporadas. Puedes componer y mezclar funciones de pandas y tus propios algoritmos.. 

Además, no dude en ver lo que tenemos disponible para la venta y para estudiar en el mercado, y no dude en hacer cualquier pregunta y proporcionar sus valiosos comentarios utilizando la siguiente información..

La importación y exportación de datos en pandas también es muy extensa y garantiza que pueda integrarlos fácilmente en los sistemas existentes. Si está realizando algún procesamiento de datos en Python, pandas pertenece a su caja de herramientas.