Saltar al contenido

# manejo-de-datos-en-pandas

Manejo de datos en Pandas

Volver a la portada del curso
Lectura (Markdown)

Exploración de estructuras de datos

Sección 2 · Estructuras de datos básicas

Exploración de estructuras de datos

El CSV que juntó los pedidos 2025 de las sucursales de PyShop tiene 1025 filas. Antes de calcular un solo total conviene hacerle un examen: cuántas filas y columnas hay, de qué tipo es cada una, qué falta y qué está mal escrito. En pandas ese examen se hace con una docena de métodos y toma un par de minutos. Esta lectura los recorre en el orden en que se usan y muestra cómo interpretar lo que devuelven. Los ejemplos están en el notebook explorar-pedidos.

1. Tamaño y primeras filas

shape devuelve una tupla (filas, columnas). head() muestra las primeras 5 filas, tail() las últimas y sample() una muestra al azar; con random_state la muestra es la misma en cada ejecución.

import io
import pandas as pd

df = pd.read_csv(io.StringIO(generar_csv_pedidos()))
print(df.shape)                        # (1025, 10)
print(df.tail(2)["pedido_id"].tolist())
# ['P00999', 'P01000']
df.sample(3, random_state=1)

Ya en head() aparecen pistas: la misma ciudad escrita como «CDMX» y como «Cd. de México», una «Merida» sin acento y un precio escrito «$459.00». sample() es útil porque los problemas no siempre están en las primeras filas.

2. Tipos: info y dtypes

info() imprime, por columna, cuántos valores no son nulos y su tipo (dtype), además de la memoria que ocupa la tabla (150.9 KB en este caso).

 6   cantidad         982 non-null    float64
 7   precio_unitario  1004 non-null   str
 8   estado           1025 non-null   str
 9   calificacion     642 non-null    float64
dtypes: float64(2), str(8)

Tres lecturas importantes:

  • precio_unitario es str: con un solo «$» en la columna, pandas no puede leerla como número. En pandas 3 el texto se lee con el dtype str; en versiones anteriores aparecía como object.
  • cantidad y calificacion son float64 aunque guardan enteros. Una columna int64 no admite vacíos; el nulo numérico NaN es un decimal, así que la columna pasa a float64.
  • Los conteos menores que 1025 indican faltantes: 43 en cantidad, 21 en precio y 383 en calificación.

3. Resumen estadístico: describe

Sin argumentos, describe() resume las columnas numéricas: conteo, media, desviación estándar, mínimo, cuartiles y máximo. La cantidad media por pedido es 1.77, la mediana es 1 y el máximo 5; la calificación media es 4.0. Con describe(exclude="number") resume las columnas de texto:

columnacountuniquetopfreq
pedido_id10251000P000082
ciudad102516Ciudad de México94
producto102512Sartén antiadherente102
precio_unitario10043345966

Esta tabla es el diagnóstico más rápido del archivo. Un identificador debería ser único: 1025 filas con 1000 valores distintos significan pedidos repetidos. PyShop tiene cinco sucursales, no 16 ciudades. Y 12 productos con 33 precios distintos indican que el mismo precio está escrito de varias formas.

4. Contar valores: nunique y value_counts

nunique() da el número de valores distintos de cada columna. value_counts() cuenta cuántas veces aparece cada valor de una columna, de mayor a menor; con normalize=True devuelve proporciones.

print(df["estado"].value_counts().to_dict())
# {'entregado': 742, 'enviado': 108,
#  'cancelado': 88, 'pendiente': 87}
print(df["ciudad"].value_counts().head(5).to_dict())
# {'Ciudad de México': 94, 'CDMX': 93, 'Cd. de México': 82,
#  ' Ciudad de México': 79, 'cdmx': 75}

Las cinco ciudades más frecuentes son la misma ciudad escrita de cinco formas, una de ellas con un espacio al inicio. Sin value_counts, un análisis por ciudad partiría la Ciudad de México en cinco grupos.

5. Faltantes: isna

isna() devuelve un DataFrame de True/False; como True vale 1, isna().sum() cuenta los nulos por columna. Para saber cuántas filas tienen al menos un nulo se usa isna().any(axis=1).sum(): aquí son 425 de 1025. Esa cifra anticipa un problema: borrar toda fila incompleta eliminaría más de 4 de cada 10 pedidos.

El primer diagnóstico

Con estos métodos el archivo queda descrito en una lista de tareas para la limpieza:

  1. 25 filas repetidas (1025 filas, 1000 pedidos).
  2. 16 formas de escribir cinco ciudades.
  3. Precios guardados como texto, con «$» y comas.
  4. Faltantes en cantidad, precio y calificación.

Las fechas también esconden un problema que estos métodos no muestran: mientras la columna sea texto, una fecha imposible como «2025-02-30» pasa como cualquier otra. Aparece al convertirla, en la sección de limpieza.

Trampas comunes

  • Mirar solo head(). Cinco filas no representan mil; combínalo con sample() y value_counts().
  • Confiar en el dtype de un número. Si una columna numérica sale como str, hay al menos un valor que no es número.
  • Leer count como filas. En describe y en info, count excluye los nulos.
  • Olvidar los espacios. «Guadalajara» y «Guadalajara » son valores distintos para pandas.

Antes de transformar un archivo, ejecuta shape, info(), describe(exclude="number") e isna().sum() y escribe lo que encontraste. Esa lista guía el resto del trabajo.

Recursos