# manejo-de-datos-en-pandas
Manejo de datos en Pandas
Volver a la portada del cursoExploració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_unitarioesstr: con un solo «$» en la columna, pandas no puede leerla como número. En pandas 3 el texto se lee con el dtypestr; en versiones anteriores aparecía comoobject.cantidadycalificacionsonfloat64aunque guardan enteros. Una columnaint64no admite vacíos; el nulo numéricoNaNes un decimal, así que la columna pasa afloat64.- 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:
| columna | count | unique | top | freq |
|---|---|---|---|---|
| pedido_id | 1025 | 1000 | P00008 | 2 |
| ciudad | 1025 | 16 | Ciudad de México | 94 |
| producto | 1025 | 12 | Sartén antiadherente | 102 |
| precio_unitario | 1004 | 33 | 459 | 66 |
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:
- 25 filas repetidas (1025 filas, 1000 pedidos).
- 16 formas de escribir cinco ciudades.
- Precios guardados como texto, con «
$» y comas. - 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 consample()yvalue_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
countcomo filas. Endescribey eninfo,countexcluye 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.