Pandas es una biblioteca de Python ampliamente utilizada para el análisis y manipulación de datos. Proporciona estructuras de datos eficientes y flexibles para trabajar con datos tabulares, como hojas de cálculo o bases de datos, lo que la convierte en una herramienta poderosa para el procesamiento y análisis de datos en el ámbito de la ciencia de datos y la ingeniería.
Las dos estructuras de datos principales proporcionadas por Pandas son:
DataFrame: Un DataFrame es una estructura de datos bidimensional similar a una tabla o una hoja de cálculo. Consiste en filas y columnas etiquetadas, lo que permite almacenar y manipular datos de manera tabular. Los datos en un DataFrame pueden ser heterogéneos, lo que significa que pueden contener diferentes tipos de datos, como números, cadenas, fechas, entre otros.
Series: Una Serie es una estructura de datos unidimensional similar a una matriz o una lista, pero con etiquetas asociadas a cada elemento. Puedes pensar en una Serie como una columna de un DataFrame. Las Series son útiles para trabajar con una sola columna de datos.
Pandas ofrece una amplia gama de funcionalidades para realizar operaciones de limpieza, filtrado, manipulación, agregación, visualización y análisis de datos. Algunas de las tareas comunes que se pueden realizar con Pandas incluyen:
- Cargar y guardar datos desde/hacia diferentes formatos como CSV, Excel, JSON, SQL, etc.
- Filtrar y seleccionar datos basados en condiciones específicas.
- Realizar operaciones aritméticas y estadísticas en datos.
- Agrupar y resumir datos.
- Trabajar con fechas y tiempo.
- Unir y combinar múltiples conjuntos de datos.
- Visualización de datos utilizando gráficos y trazados.
Ejemplo¶
Mostraremos un ejemplo completo de cómo utilizar pandas
con el conjunto de datos "iris":
# Importa las bibliotecas necesarias
import pandas as pd
# Cargar el conjunto de datos iris desde la biblioteca Seaborn
url='https://drive.google.com/file/d/1xj1ynrjuZrEKuoCTtD603UyzqCw_byfD/view?usp=drive_link'
url='https://drive.google.com/uc?id=' + url.split('/')[-2]
iris = pd.read_csv(url, sep="," )
iris.head()
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
Explora el conjunto de datos:
# Columnas del dataframe
print(iris.columns)
Index(['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'], dtype='object')
# Muestra información general sobre el conjunto de datos
print(iris.info())
<class 'pandas.core.frame.DataFrame'> RangeIndex: 150 entries, 0 to 149 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 sepal_length 150 non-null float64 1 sepal_width 150 non-null float64 2 petal_length 150 non-null float64 3 petal_width 150 non-null float64 4 species 150 non-null object dtypes: float64(4), object(1) memory usage: 6.0+ KB None
# Estadísticas descriptivas del conjunto de datos
print(iris.describe())
sepal_length sepal_width petal_length petal_width count 150.000000 150.000000 150.000000 150.000000 mean 5.843333 3.057333 3.758000 1.199333 std 0.828066 0.435866 1.765298 0.762238 min 4.300000 2.000000 1.000000 0.100000 25% 5.100000 2.800000 1.600000 0.300000 50% 5.800000 3.000000 4.350000 1.300000 75% 6.400000 3.300000 5.100000 1.800000 max 7.900000 4.400000 6.900000 2.500000
# Cuenta la cantidad de muestras para cada especie
print(iris['species'].value_counts())
setosa 50 versicolor 50 virginica 50 Name: species, dtype: int64
# Valores nulos
print(iris.isna().sum())
sepal_length 0 sepal_width 0 petal_length 0 petal_width 0 species 0 dtype: int64
# Verificar si hay datos duplicados en todo el DataFrame
duplicados_totales = iris.duplicated()
print("Datos duplicados en todo el DataFrame:")
print(duplicados_totales.sum())
Datos duplicados en todo el DataFrame: 1
# Eliminar Duplicados en todo el DataFrame
iris = iris.drop_duplicates()
Acceso a datos en el DataFrame
# Acceso a una columna específica (por ejemplo, 'sepal_length')
iris['sepal_length'].head()
0 5.1 1 4.9 2 4.7 3 4.6 4 5.0 Name: sepal_length, dtype: float64
# Acceso a múltiples columnas (por ejemplo, 'sepal_length' y 'species')
iris[['sepal_length', 'species']].head()
sepal_length | species | |
---|---|---|
0 | 5.1 | setosa |
1 | 4.9 | setosa |
2 | 4.7 | setosa |
3 | 4.6 | setosa |
4 | 5.0 | setosa |
# Acceso a una fila específica (por ejemplo, la primera fila)
print(iris.loc[0])
sepal_length 5.1 sepal_width 3.5 petal_length 1.4 petal_width 0.2 species setosa Name: 0, dtype: object
# Acceso a un valor específico (por ejemplo, el valor en la fila 0 y columna 'sepal_length')
print(iris.loc[0, 'sepal_length'])
5.1
Filtrar filas basadas en una condición:
# Filtrar filas basadas en una condición (por ejemplo, seleccionar solo las flores de especie 'setosa')
condicion = (iris['species'] == 'setosa')
filas_filtradas = iris[condicion]
print("\nFilas filtradas:")
filas_filtradas.head()
Filas filtradas:
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
Agregar una nueva columna calculada:
# Agregar una nueva columna calculada (por ejemplo, calcular el índice de relación entre la longitud del sépalo y el ancho del sépalo)
iris['sepal_ratio'] = iris['sepal_length'] / iris['sepal_width']
print("\nCon una nueva columna calculada:")
iris.head()
Con una nueva columna calculada:
sepal_length | sepal_width | petal_length | petal_width | species | sepal_ratio | |
---|---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | 1.457143 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | 1.633333 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | 1.468750 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | 1.483871 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | 1.388889 |
Ordenar el conjunto de datos por una columna específica:
# Ordenar el conjunto de datos por una columna específica (por ejemplo, ordenar por la longitud del sépalo en orden descendente)
iris_ordenado = iris.sort_values(by='sepal_length', ascending=False)
print("\nConjunto de datos ordenado:")
iris_ordenado.head()
Conjunto de datos ordenado:
sepal_length | sepal_width | petal_length | petal_width | species | sepal_ratio | |
---|---|---|---|---|---|---|
131 | 7.9 | 3.8 | 6.4 | 2.0 | virginica | 2.078947 |
135 | 7.7 | 3.0 | 6.1 | 2.3 | virginica | 2.566667 |
117 | 7.7 | 3.8 | 6.7 | 2.2 | virginica | 2.026316 |
118 | 7.7 | 2.6 | 6.9 | 2.3 | virginica | 2.961538 |
122 | 7.7 | 2.8 | 6.7 | 2.0 | virginica | 2.750000 |
Realizar una operación de agregación por grupo:
# Agrupar por 'species' y calcular la media de cada característica
media_por_especie = iris.groupby('species').mean()
media_por_especie
sepal_length | sepal_width | petal_length | petal_width | sepal_ratio | |
---|---|---|---|---|---|
species | |||||
setosa | 5.006000 | 3.428000 | 1.462000 | 0.246000 | 1.470188 |
versicolor | 5.936000 | 2.770000 | 4.260000 | 1.326000 | 2.160402 |
virginica | 6.604082 | 2.979592 | 5.561224 | 2.028571 | 2.232132 |
Pivotear una tabla
# Realizar un pivot para obtener la media de la longitud del sépalo para cada especie
tabla_pivot = pd.pivot_table(iris, values='sepal_length', index='species', aggfunc='mean')
print("\nPivot Table - Media de la longitud del sépalo para cada especie:")
tabla_pivot
Pivot Table - Media de la longitud del sépalo para cada especie:
sepal_length | |
---|---|
species | |
setosa | 5.006000 |
versicolor | 5.936000 |
virginica | 6.604082 |