Fundamentos de Pandas para manipulación y análisis de datos en Python

Introducción a Pandas

Pandas es una biblioteca de código abierto para Python, especializada en el manejo y análisis de datos. Proporciona estructuras de datos de alto rendimiento como Series (unidimensional) y DataFrame (bidimensional), que facilitan la manipulación de conjuntos de datos heterogéneos. Su arquitectura se basa en NumPy, lo que permite una integración eficiente con otras herramientas científicas de Python.

Creación de objetos de datos

Generación de Series

Una Serie puede crearse a partir de un diccionario o de una lista/array. Al usar un diccionario, las claves se convierten en etiquetas de índice.


import pandas as pd
import numpy as np

# Ejemplo con diccionario
info_dict = {'latitud': 34.05, 'longitud': -118.25, 'altitud': 71}
serie_localizacion = pd.Series(info_dict)
print(serie_localizacion)

# Ejemplo con lista y etiquetas personalizadas
valores = [15.5, 22.3, 18.7]
etiquetas = ['temperatura_min', 'temperatura_media', 'temperatura_max']
serie_clima = pd.Series(valores, index=etiquetas)
print(serie_clima)

Los objetos Series tienen dos atributos principales: values (almacena los datos como un array de NumPy) e index (contiene las etiquetas).

Generación de DataFrame

Un DataFrame puede construirse combinando múltiples Series (como columnas) o directamente desde un array bidimensional con etiquetas de filas y columnas.


# Creación mediante Series
serie_edades = pd.Series([25, 30, 35], index=['Ana', 'Luis', 'María'])
serie_ciudades = pd.Series(['Madrid', 'Barcelona', 'Valencia'], index=['Ana', 'Luis', 'María'])
df_personas = pd.DataFrame({'edad': serie_edades, 'ciudad': serie_ciudades})
print(df_personas)

# Creación mediante array con etiquetas
datos_array = np.array([[2015, 4.2], [2020, 3.8], [2023, 4.5]])
filas = ['A', 'B', 'C']
columnas = ['año', 'valor']
df_metricas = pd.DataFrame(datos_array, index=filas, columns=columnas)
print(df_metricas)

Acceso y selección de datos

Indexación con etiquetas (loc) y posiciones (iloc)

Pandas distingue entre índices explícitos (etiquetas) e implícitos (posiciones). Para evitar ambigüedades, se usan los indexadores loc (para etiquetas) e iloc (para posiciones).


# Ejemplo con Series
serie_datos = pd.Series([10, 20, 30, 40], index=['w', 'x', 'y', 'z'])
# Acceso por etiqueta
print(serie_datos.loc['x'])
# Acceso por posición
print(serie_datos.iloc[1])

# Ejemplo con DataFrame
df = pd.DataFrame({'grupo': ['A', 'B', 'A', 'C'], 'puntuacion': [85, 90, 78, 92]})
# Seleccionar fila por etiqueta (asumiendo índice por defecto)
print(df.loc[1])
# Seleccionar fila por posición
print(df.iloc[2])
# Seleccionar columna específica
print(df['puntuacion'])

Los cortes (slicing) con loc son inclusivos en ambos extremos, mientras que con iloc siguen la convención exclusiva del final.

Transformación de estructuras

Operaciones de remodelación

Las transformaciones comunes incluyen transposición, inversión de ejes y concatenación de objetos.


# Transposición de un DataFrame
df_transpuesto = df_metricas.T
print(df_transpuesto)

# Inversión de columnas o filas usando iloc
df_invertido = df_transpuesto.iloc[:, ::-1]
print(df_invertido)

# Concatenación de Series
serie_extra = pd.Series([5, 6, 7], index=['A', 'B', 'D'])
serie_concatenada = pd.concat([serie_datos, serie_extra])
print(serie_concatenada)

Operaciones con datos

Operaciones vectorizadas

Las operaciones aritméticas se aplican elemento a elemento. Entre objetos, se alinean por etiquetas, introduciendo valores faltantes (NaN) donde no haya coincidencia.


# Operación entre Serie y escalar
serie_numeros = pd.Series([1, 2, 3, 4])
print(serie_numeros * 2)

# Operación entre dos Series con índices diferentes
serie_a = pd.Series([10, 20, 30], index=[1, 2, 3])
serie_b = pd.Series([5, 15, 25], index=[2, 3, 4])
print(serie_a + serie_b)  # Resultado con NaN en índices no coincidentes

Manejo de valores faltantes

Detección y tratamiento de NaN

Los valores falatntes se representan como NaN. Se pueden detectar con isnull(), eliminar con dropna() o rellenar con fillna().


datos_con_nulos = pd.Series([10, np.nan, 30, np.nan, 50])
print(datos_con_nulos.isnull())

# Eliminar filas con cualquier valor nulo
print(datos_con_nulos.dropna())

# Rellenar valores nulos con la media
media = datos_con_nulos.mean()
print(datos_con_nulos.fillna(media))

Carga de datos desde archivos

Importación de archivos CSV

Pandas puede leer datos de archivos CSV usando read_csv(). Es común especificar el índice con el parámetro index_col.


# Suponiendo un archivo 'datos_ventas.csv'
df_ventas = pd.read_csv('datos_ventas.csv', index_col=0)
print(df_ventas.head())  # Muestra las primeras filas

Aálisis exploratorio

Resumen estadístico y tablas pivote

El método describe() ofrece un resumen estadístico. Las tablas pivote con pivot_table() permiten agregar datos por categorías.


# Resumen estadístico de un DataFrame numérico
print(df_metricas.describe())

# Crear una tabla pivote para analizar relación entre variables
# Ejemplo con datos ficticios de supervivencia
df_supervivencia = pd.DataFrame({
    'genero': ['M', 'F', 'M', 'F'],
    'clase': ['1ra', '2da', '1ra', '3ra'],
    'sobrevivio': [0, 1, 1, 0]
})
print(pd.pivot_table(df_supervivencia, values='sobrevivio', index='genero', columns='clase', aggfunc='mean'))

Para características continuas, se pueden discretizar usando pd.cut() antes de la agregación.

Etiquetas: pandas Python dataframe series analisis-datos

Publicado el 6-8 08:20