🐼 Pandas: La Hoja de Cálculo de Python #
Si NumPy es la base para el cálculo numérico y SciPy es la navaja suiza científica, Pandas es la herramienta fundamental para el análisis y manipulación de datos. Su nombre, que proviene de “Panel Data” (datos de panel), refleja su propósito de gestionar datos estructurados de manera eficiente. Pandas introduce dos estructuras de datos principales: la Series y el DataFrame. El DataFrame es, sin duda, la más importante, y puedes pensar en ella como una hoja de cálculo o una tabla de base de datos dentro de Python, completa con filas y columnas.
1. Conceptos Fundamentales: Series y DataFrame #
- Series: Un
Serieses un arreglo unidimensional que puede contener cualquier tipo de dato (enteros, flotantes, cadenas, etc.). Se asemeja a una columna de una hoja de cálculo. - DataFrame: El
DataFramees la estructura de datos bidimensional y es la columna vertebral de Pandas. Está compuesto por una colección deSeriesdel mismo tamaño, compartiendo un índice común. Esto es lo que lo hace tan parecido a una tabla: tiene filas (índice) y columnas (etiquetas).
2. Creando y Cargando Datos #
La forma más común de usar Pandas en la práctica es cargando datos desde archivos. Pandas soporta una variedad de formatos, siendo el más popular el CSV (Comma-Separated Values).
import pandas as pd
import numpy as np
# 1. Creando un DataFrame desde un diccionario
datos = {'motor': ['Motor A', 'Motor B', 'Motor C'],
'potencia_hp': [150, 200, 180],
'torque_nm': [250, 320, 290]}
df_motores = pd.DataFrame(datos)
print(df_motores)
# 2. Cargando datos desde un archivo CSV
# Supongamos que tienes un archivo llamado 'datos_sensores.csv'
# df_sensores = pd.read_csv('datos_sensores.csv')
# print(df_sensores.head()) # Muestra las primeras 5 filas
3. Exploración y Acceso a Datos #
Una vez que tus datos están cargados, la primera tarea es explorarlos. Pandas tiene funciones que te permiten echar un vistazo rápido a la estructura y el contenido de tu DataFrame.
df.head()ydf.tail(): Muestran las primeras o últimas filas.df.info(): Proporciona un resumen conciso del DataFrame, incluyendo el tipo de datos de cada columna y si hay valores nulos.df.describe(): Genera estadísticas descriptivas (media, desviación estándar, min, max, etc.) para las columnas numéricas.- Acceso a columnas: Puedes acceder a una columna como si fuera un diccionario o usando la notación de punto. Por ejemplo,
df_motores['potencia_hp']odf_motores.potencia_hp. - Acceso a filas: Para seleccionar filas por su índice numérico, usa
df.iloc[fila]y para acceder por su etiqueta de índice, usadf.loc[fila].
4. Manipulación de Datos y Funciones Útiles #
Pandas sobresale en la manipulación de datos, permitiéndote transformar tus DataFrames de manera intuitiva. Aquí te presento algunas de las funciones más utilizadas en ingeniería.
Filtrado y Selección #
-
Selección por Condición: Permite seleccionar filas que cumplen una o más condiciones.
# Filtrar motores con más de 180 hp motores_potentes = df_motores[df_motores['potencia_hp'] > 180] print("Motores con alta potencia:") print(motores_potentes) -
Selección con
loceiloc:locse usa para seleccionar por nombre de fila y columna.ilocse usa para seleccionar por posición de fila y columna.
# Seleccionar la segunda fila por posición fila_2 = df_motores.iloc[1] print("\nSegunda fila del DataFrame:") print(fila_2) # Seleccionar filas y columnas por nombre seleccion = df_motores.loc[0:1, ['motor', 'potencia_hp']] print("\nSelección por nombres de fila y columna:") print(seleccion)
Manejo de Valores Faltantes #
Los datos reales a menudo tienen valores perdidos. Pandas proporciona funciones para detectarlos y manejarlos.
df.isnull()ydf.notnull(): Devuelven un DataFrame de booleanos indicando si un valor es nulo (NaN).df.dropna(): Elimina las filas o columnas que contienen valores nulos.df.fillna(): Rellena los valores nulos con un valor específico (por ejemplo, el promedio, la mediana, o un valor fijo).
Agregación y Agrupamiento #
Una de las operaciones más potentes de Pandas es groupby(), que te permite dividir los datos en grupos y aplicar una función a cada grupo.
# Crear un DataFrame de datos de ensayos de diferentes materiales
datos_ensayo = {'material': ['Acero', 'Acero', 'Aluminio', 'Aluminio'],
'carga_N': [1000, 1200, 500, 650],
'deflexion_mm': [1.5, 1.8, 2.0, 2.5]}
df_ensayos = pd.DataFrame(datos_ensayo)
# Calcular la carga promedio por tipo de material
carga_promedio = df_ensayos.groupby('material')['carga_N'].mean()
print("\nCarga promedio por material:")
print(carga_promedio)
Unión de DataFrames #
La unión de datos de diferentes fuentes es una tarea común. Pandas ofrece funciones como merge() para unir DataFrames, similar a las uniones en SQL.
# DataFrame de datos de producción
df_produccion = pd.DataFrame({'componente_id': [1, 2, 3],
'fecha_produccion': ['2025-01-01', '2025-01-02', '2025-01-03']})
# DataFrame de datos de control de calidad
df_calidad = pd.DataFrame({'componente_id': [1, 3],
'prueba_ok': [True, False]})
# Unir los dos DataFrames por 'componente_id'
df_unido = pd.merge(df_produccion, df_calidad, on='componente_id')
print("\nDataFrame unido de producción y calidad:")
print(df_unido)
Funciones Adicionales de Manipulación #
-
Aplicar una función: Usa
apply()para aplicar una función a lo largo de un eje del DataFrame. Esto es útil para transformaciones personalizadas.# Convertir potencia de HP a kW (1 HP = 0.746 kW) def hp_a_kw(hp): return hp * 0.746 df_motores['potencia_kw'] = df_motores['potencia_hp'].apply(hp_a_kw) print("\nDataFrame con nueva columna de potencia en kW:") print(df_motores) -
Ordenar datos: Con
sort_values(), puedes ordenar el DataFrame por los valores de una o más columnas.# Ordenar los motores por potencia de forma descendente df_motores_ordenado = df_motores.sort_values(by='potencia_hp', ascending=False) print("\nDataFrame ordenado por potencia:") print(df_motores_ordenado) -
Eliminar duplicados: La función
drop_duplicates()te ayuda a limpiar el DataFrame de filas duplicadas.# Crear un DataFrame con una fila duplicada df_duplicado = pd.DataFrame({'id': [1, 2, 2], 'valor': [10, 20, 20]}) # Eliminar la fila duplicada df_sin_duplicados = df_duplicado.drop_duplicates() print("\nDataFrame sin duplicados:") print(df_sin_duplicados)
El dominio de Pandas es una habilidad esencial para cualquier profesional que necesite trabajar con grandes volúmenes de datos experimentales o de simulación. Es la puerta de entrada para un análisis de datos más profundo y la base para el aprendizaje automático y la inteligencia artificial en el mundo de la ingeniería.
Ejercicios Prácticos de Pandas: ¡Manipula Datos Como un Experto! #
Pon a prueba tu conocimiento de Pandas con estos ejercicios prácticos, que te ayudarán a dominar las funciones más comunes para el análisis de datos en ingeniería.
Para todos los ejercicios, usa el siguiente DataFrame como punto de partida.
import pandas as pd
import numpy as np
# DataFrame de datos de un ensayo de materiales
datos_materiales = {
'material_id': ['M101', 'M102', 'M103', 'M104', 'M105', 'M106', 'M107', 'M108', 'M109', 'M110'],
'tipo_material': ['Acero', 'Aluminio', 'Compuesto', 'Acero', 'Aluminio', 'Compuesto', 'Acero', 'Aluminio', 'Acero', 'Acero'],
'esfuerzo_max_mpa': [550, 200, 450, 580, 210, 480, 560, 220, 575, 590],
'deformacion_max_mm': [1.2, 3.5, 0.8, 1.3, 3.6, 0.9, 1.25, 3.8, 1.4, 1.35],
'temperatura_c': [25, 25, 30, 150, 150, 30, 25, 25, 150, 25],
'costo_kg': [1.5, 3.0, 10.0, 1.8, 3.2, 11.0, 1.6, 3.1, 1.9, 1.7]
}
df = pd.DataFrame(datos_materiales)
1. Exploración y Filtrado #
- Muestra las primeras 5 filas del DataFrame para una inspección rápida.
Haz clic para ver la solución
print(df.head(n=5)) - Muestra las últimas 3 filas.
- Utiliza
df.describe()para obtener un resumen estadístico de las columnas numéricas. ¿Cuál es el esfuerzo máximo promedio y la desviación estándar? - Filtra y muestra todos los materiales con un esfuerzo máximo superior a 550 MPa.
- Selecciona los materiales de tipo ‘Acero’ que se probaron a una temperatura de 25 °C.
2. Selección y Manipulación #
- Selecciona la fila del material con el
material_id‘M105’ usandoloc.Haz clic para ver la solución
print(df.loc[df['material_id'] == 'M105']) - Selecciona las columnas
esfuerzo_max_mpaydeformacion_max_mmpara los materiales ‘M101’ a ‘M104’ usando unloccon un rango de etiquetas. - Agrega una nueva columna llamada
costo_totalque sea el producto deesfuerzo_max_mpaporcosto_kg. - Convierte la columna
temperatura_cde grados Celsius a grados Fahrenheit (\(F = C \cdot 9/5 + 32\)) y guarda el resultado en una nueva columna llamadatemperatura_f. - Utiliza
df.ilocpara seleccionar todas las filas de la posición 2 a la 6 (exclusiva) y solo las columnas de la posición 0 a la 3 (exclusiva).
3. Agrupamiento y Agregación #
- Agrupa el DataFrame por
tipo_materialy calcula el costo promedio por kg para cada tipo.Haz clic para ver la solución
costo_promedio = df.groupby('tipo_material')['costo_kg'].mean() print(costo_promedio) - Agrupa por
tipo_materialy encuentra el esfuerzo máximo más alto (max()) y más bajo (min()) para cada grupo. - Agrupa por
temperatura_cy calcula la media delesfuerzo_max_mpapara cada temperatura. - Realiza un agrupamiento por
tipo_materialy, en una sola operación, calcula el promedio (mean) y la desviación estándar (std) deesfuerzo_max_mpaydeformacion_max_mm. - Agrupa por
tipo_materialy usa la función.size()para contar cuántas muestras hay de cada tipo de material.
4. Funciones Avanzadas #
- Manejo de valores nulos: Crea una copia del DataFrame y asigna
np.nana ladeformacion_max_mmde los materiales ‘M102’ y ‘M109’. Luego, rellena esos valores nulos con la mediana de la columna.Haz clic para ver la solución
# Crear una copia del DataFrame df_copia = df.copy() # Asignar valores nulos a 'deformacion_max_mm' para los materiales 'M102' y 'M109' df_copia.loc[df_copia['material_id'].isin(['M102', 'M109']), 'deformacion_max_mm'] = np.nan # Rellenar valores nulos con la mediana de la columna mediana_deformacion = df_copia['deformacion_max_mm'].median() df_copia['deformacion_max_mm'].fillna(mediana_deformacion, inplace=True) print(df_copia) - Eliminación de duplicados: Inserta una fila duplicada en el DataFrame (copiando, por ejemplo, la fila del ‘M101’). Luego, usa
drop_duplicates()para eliminar la fila duplicada y confirma que el DataFrame tiene su tamaño original. - Ordenamiento: Ordena el DataFrame de forma descendente basándote en la columna
deformacion_max_mm. - Unión de datos: Crea un nuevo DataFrame
df_proveedorcon las columnasmaterial_idyproveedor, y luego únelo con el DataFrame original (df) usandopd.merge().df_proveedor = pd.DataFrame({'material_id': ['M101', 'M105', 'M109'], 'proveedor': ['Proveedor A', 'Proveedor B', 'Proveedor A']})
- Filtrado múltiple: Usa una sola línea de código para filtrar el DataFrame y mostrar solo los materiales de ‘Acero’ que tienen un esfuerzo máximo superior a 570 MPa y un costo por kg inferior a 1.8.