Mi hoja de trucos de pandas

Un maestro me dijo una vez que si buscas un análogo de un programador en el mundo de los libros, resulta que los programadores no son como los libros de texto, sino más bien el índice: no recuerdan todo, pero saben cómo encontrar rápidamente lo que necesitan.

La capacidad de encontrar rápidamente descripciones de funciones permite a los programadores trabajar productivamente sin perder el estado de la transmisión. Es por eso que creé la hoja de trucos presentada aquí pandase incluí lo que uso todos los días, creando aplicaciones web y modelos de aprendizaje automático. Esta no es una lista exhaustiva de características , pero incluye las funciones que uso con más frecuencia, ejemplos y mis explicaciones sobre situaciones en las que estas funciones son especialmente útiles.



pandas

1. Preparación para el trabajo.


Si desea probar de forma independiente lo que se discutirá aquí, descargue el conjunto de datos de la Base de datos de recomendaciones de Anime de Kaggle. Descomprímalo y colóquelo en la misma carpeta donde se encuentra su Jupyter Notebook (en adelante - bloc de notas).

Ahora ejecuta los siguientes comandos.

import pandas as pd
import numpy as np
anime = pd.read_csv('anime-recommendations-database/anime.csv')
rating = pd.read_csv('anime-recommendations-database/rating.csv')
anime_modified = anime.set_index('name')

Después de eso, debería poder reproducir lo que mostraré en las siguientes secciones de este material.

2. Importar datos


▍ Descargar datos CSV


Aquí quiero hablar sobre la conversión de datos CSV directamente en marcos de datos (en marcos de datos). A veces, al descargar datos en formato CSV, debe especificar su codificación (por ejemplo, puede parecer encoding='ISO-8859–1'). Esto es lo primero que debe intentar hacer si resulta que después de cargar los datos, el marco de datos contiene caracteres ilegibles.

anime = pd.read_csv('anime-recommendations-database/anime.csv')


Datos CSV descargados

Hay una función similar para cargar datos desde archivos Excelpd.read_excel.

▍ Crear un marco de datos a partir de datos ingresados ​​manualmente


Esto puede ser útil cuando necesita ingresar manualmente datos simples en el programa. Por ejemplo, si necesita evaluar los cambios que experimentan los datos que pasan por la tubería de procesamiento de datos.

df = pd.DataFrame([[1,'Bob', 'Builder'],
                  [2,'Sally', 'Baker'],
                  [3,'Scott', 'Candle Stick Maker']], 
columns=['id','name', 'occupation'])


Entrada manual

▍ Copiar un marco de datos


Copiar marcos de datos puede ser útil en situaciones en las que necesita realizar cambios en estos datos, pero también debe guardar el original. Si es necesario copiar los marcos de datos, se recomienda hacerlo inmediatamente después de descargarlos.

anime_copy = anime.copy(deep=True)


Copia del marco de datos.

3. Exportación de datos


▍ Exportar a formato CSV


Al exportar datos, se guardan en la misma carpeta que el bloc de notas. A continuación se muestra un ejemplo de cómo guardar las primeras 10 filas de un marco de datos, pero qué exactamente guardar depende de la tarea específica.

rating[:10].to_csv('saved_ratings.csv', index=False)

Puede exportar datos como archivos de Excel utilizando la función df.to_excel.

4. Ver e investigar datos


▍ Obtención de n registros desde el principio o el final del marco de datos


Primero, hablemos sobre la salida de los primeros nelementos del marco de datos. A menudo deduzco varios elementos desde el comienzo de un marco de datos en algún lugar de un cuaderno. Esto me permite acceder convenientemente a estos datos en caso de que me olvide de lo que hay exactamente en el marco de datos. La conclusión de los últimos elementos juega un papel similar.

anime.head(3)
rating.tail(1)


Datos del comienzo del marco de datos


Datos del final del marco de datos

▍ Contando el número de filas en un marco de datos


La función len(),que mostraré aquí no está incluida pandas. Pero es muy adecuado para contar el número de filas de marcos de datos. Los resultados de su trabajo pueden almacenarse en una variable y usarse donde se necesitan.

len(df)
#=> 3

▍Contar el número de valores únicos en una columna


Para calcular el número de valores únicos en una columna, puede usar esta construcción:

len(ratings['user_id'].unique())

▍ Obtención de información del marco de datos


La información sobre el marco de datos incluye información general al respecto, como el encabezado, el número de valores, los tipos de datos de las columnas.

anime.info()


Información del marco de datos

Hay otra función similar adf.info-df.dtypes. Solo muestra información sobre los tipos de datos de las columnas.

▍ Visualización de estadísticas sobre el marco de datos


Conocer la información estadística sobre el marco de datos es muy útil en situaciones donde contiene muchos valores numéricos. Por ejemplo, conocer los valores promedio, mínimo y máximo de una columna ratingnos da una idea de cómo se ve el marco de datos en su conjunto. Aquí está el comando correspondiente:

anime.describe()


Estadísticas del marco de datos

▍Cálculo del importe


Para calcular el número de valores en una columna en particular, puede usar la siguiente construcción:

anime.type.value_counts()


Cuenta la cantidad de elementos en una columna

5. Extraer información de marcos de datos


▍Creando una lista u objeto de serie basado en valores de columna


Esto puede ser útil en los casos en que desee extraer los valores de las columnas en variables xy ypara entrenar el modelo. Los siguientes comandos se aplican aquí:

anime['genre'].tolist()
anime['genre']


Los resultados del comando anime ['género']. Tolist ()


Resultados del equipo de Anime ['género']

▍ Obtener una lista de valores de un índice


Hablemos de obtener listas de valores de un índice. Tenga en cuenta que usé el marco de datos aquí anime_modified, ya que sus valores de índice parecen más interesantes.

anime_modified.index.tolist()


Resultados del equipo

▍ Obtención de una lista de valores de columna


Aquí hay un comando que le permite obtener una lista de valores de columna:

anime.columns.tolist()


Resultados del equipo

6. Agregar datos al marco de datos y eliminarlos de él


▍Conectar una nueva columna con un valor especificado al marco de datos


A veces tengo que agregar nuevas columnas a los marcos de datos. Por ejemplo, en los casos en que tengo conjuntos de prueba y entrenamiento en dos marcos de datos diferentes, y antes de combinarlos, necesito marcarlos para que puedan distinguirse más adelante. Para esto, se utiliza la siguiente construcción:

anime['train set'] = True

▍Cree un nuevo marco de datos a partir de un subconjunto de columnas


Esto puede ser útil si desea guardar varias columnas de un gran marco de datos en el nuevo marco de datos, pero no desea anotar los nombres de las columnas que desea eliminar.

anime[['name','episodes']]


Resultado del comando

▍ Eliminar columnas especificadas


Esta técnica puede ser útil si necesita eliminar solo unas pocas columnas del marco de datos. Si necesita eliminar muchas columnas, esta tarea puede ser bastante tediosa, así que aquí prefiero usar la oportunidad descrita en la sección anterior.

anime.drop(['anime_id', 'genre', 'members'], axis=1).head()


Resultados del equipo

▍ Agregar una fila con la suma de valores de otras filas al marco de datos


Para demostrar este ejemplo, crearemos independientemente un pequeño marco de datos con el que sea conveniente trabajar. Lo más interesante aquí es el diseño df.sum(axis=0), que le permite obtener la suma de los valores de diferentes filas. 

df = pd.DataFrame([[1,'Bob', 8000],
                  [2,'Sally', 9000],
                  [3,'Scott', 20]], columns=['id','name', 'power level'])
df.append(df.sum(axis=0), ignore_index=True)


El resultado del comando

El comando de la vista ledf.sum(axis=1)permite resumir los valores en las columnas.

Un mecanismo similar también es aplicable para calcular valores promedio. Por ejemplo -df.mean(axis=0).

7. Combinando marcos de datos


▍ Concatenación de dos marcos de datos


Esta técnica es aplicable en situaciones en las que hay dos marcos de datos con las mismas columnas que deben combinarse.

En este ejemplo, primero dividimos el marco de datos en dos partes, y luego combinamos estas partes nuevamente:

df1 = anime[0:2]
df2 = anime[2:4]
pd.concat([df1, df2], ignore_index=True)


Dataframe df1


Datframe df2


Marco de datos que combina df1 y df2

▍ Fusionar marcos de datos


La función df.mergeque veremos aquí es similar a la combinación SQL izquierda. Se utiliza cuando dos marcos de datos deben combinarse en una columna determinada.

rating.merge(anime, left_on=’anime_id’, right_on=’anime_id’, suffixes=(‘_left’, ‘_right’))


Resultados del equipo

8. Filtrado


▍ Obtener filas con los valores de índice deseados


Los valores de índice del marco de datos anime_modifiedson los nombres del anime. Observe cómo usamos estos nombres para seleccionar columnas específicas.

anime_modified.loc[['Haikyuu!! Second Season','Gintama']]


Resultados del equipo

▍ Obtener cadenas por índices numéricos


Esta técnica es diferente de la descrita en la sección anterior. Cuando se utiliza la función, a la df.ilocprimera línea se le asigna un índice 0, la segunda es un índice 1, y así sucesivamente. Dichos índices se asignan a filas incluso si el marco de datos se ha modificado y los valores de cadena se utilizan en su columna de índice.

La siguiente construcción le permite seleccionar las primeras tres filas del marco de datos:

anime_modified.iloc[0:3]


Resultados del equipo

▍ Obtener filas por valores de columna dados


Para obtener filas de un marco de datos en una situación donde hay una lista de valores de columna, puede usar el siguiente comando:

anime[anime['type'].isin(['TV', 'Movie'])]


Los resultados del comando

Si estamos interesados ​​en un solo significado, puede usar este diseño:

anime[anime[‘type’] == 'TV']

▍ Obtención de un segmento de marco de datos


Esta técnica es similar a obtener una porción de una lista. Es decir, estamos hablando de obtener un fragmento de un marco de datos que contenga filas correspondientes a una configuración de índice dada.

anime[1:3]


Resultados del equipo

▍ Filtrado por valor


Desde los marcos de datos, puede seleccionar las filas que coinciden con la condición especificada. Tenga en cuenta que el uso de este método conserva los valores de índice existentes.

anime[anime['rating'] > 8]


Resultados del equipo

9. Ordenar


Para ordenar los marcos de datos por valores de columna, puede usar la función df.sort_values:

anime.sort_values('rating', ascending=False)


Resultados del equipo

10. Agregación


▍Df.groupby y contando el número de registros


Aquí se explica cómo contar el número de registros con diferentes valores en columnas:

anime.groupby('type').count()


Resultados del equipo

▍ Función df.groupby y agregación de columnas de varias maneras


Presta atención a lo que se usa aquí reset_index(). De lo contrario, la columna se typeconvierte en una columna de índice. En la mayoría de los casos, recomiendo hacer lo mismo.

anime.groupby(["type"]).agg({
  "rating": "sum",
  "episodes": "count",
  "name": "last"
}).reset_index()

▍ Crear una tabla dinámica


Para extraer algunos datos del marco de datos, no hay nada mejor que una tabla dinámica. Tenga en cuenta que aquí filtré seriamente el marco de datos, lo que aceleró la creación de la tabla dinámica.

tmp_df = rating.copy()
tmp_df.sort_values('user_id', ascending=True, inplace=True)
tmp_df = tmp_df[tmp_df.user_id < 10
tmp_df = tmp_df[tmp_df.anime_id < 30]
tmp_df = tmp_df[tmp_df.rating != -1]
pd.pivot_table(tmp_df, values='rating', index=['user_id'], columns=['anime_id'], aggfunc=np.sum, fill_value=0)


Resultados del equipo

11. Limpieza de datos


▍ Escribir en celdas que contengan el valor NaN de algún otro valor


Aquí hablamos de escribir valores 0en celdas que contienen el valor NaN. En este ejemplo, creamos la misma tabla dinámica que antes, pero sin uso fill_value=0. Y luego use la función fillna(0)para reemplazar los valores NaNcon 0.

pivot = pd.pivot_table(tmp_df, values='rating', index=['user_id'], columns=['anime_id'], aggfunc=np.sum)
pivot.fillna(0)


Tabla que contiene valores de NaN


Resultados de reemplazar los valores de NaN con 0

12. Otras características útiles


▍ Muestreo de muestras aleatorias de un conjunto de datos


Uso la función df.samplecada vez que necesito obtener un pequeño conjunto aleatorio de filas de un gran marco de datos. Si se usa un parámetro frac=1, la función le permite obtener un análogo del marco de datos original, cuyas filas se mezclarán.

anime.sample(frac=0.25)


Resultados del equipo

▍Seleccionar filas de marco de datos


La siguiente construcción le permite iterar sobre las filas de un marco de datos:

for idx,row in anime[:2].iterrows():
    print(idx, row)


Resultados del equipo

▍ La velocidad de datos de IOPub de lucha excedió el error


Si encuentra un error IOPub data rate exceeded, intente usar el siguiente comando al iniciar Jupyter Notebook:

jupyter notebook — NotebookApp.iopub_data_rate_limit=1.0e10

Resumen


Aquí hablé sobre algunos pandastrucos útiles para usar el entorno Jupyter Notebook. Espero que mi hoja de trucos sea útil.

¡Queridos lectores! ¿Hay alguna oportunidad pandassin la cual no puedas imaginar tu trabajo diario?


All Articles