Pandas es una librería de código abierto que proporciona estructuras de datos y está diseñado para manejar y analizar datos tabulares en Python. Pandas se basa en NumPy, lo que le permite integrarse bien en el ecosistema de la ciencia de los datos junto a otras librerías como Scikit-learn
y Matplotlib
.
En concreto, los puntos clave de esta librería son:
Series
que son arrays unidimensionales etiquetados, similares a un vector, lista o secuencia y que es capaz de contener cualquier tipo de datos, y los DataFrames
, que es una estructura bidimensional etiquetada con columnas que pueden ser de diferentes tipos, similar a una hoja de cálculo o a una tabla SQL.Pandas es una herramienta fundamental para cualquier desarrollador que trabaje con datos en Python, ya que proporciona una amplia variedad de herramientas para la exploración, limpieza y transformación de datos, haciendo que el proceso de análisis sea más eficiente y efectivo.
Pandas proporciona dos estructuras de datos principales: Series
y DataFrames
.
Una serie en Pandas es una estructura de datos unidimensional etiquetada. Es similar a un array de 1D de NumPy, pero tiene un índice que permite el acceso a los valores por etiqueta. Una serie puede contener cualquier tipo de datos: enteros, cadenas, objetos de Python...
Una serie en Pandas tiene dos partes diferenciadas:
Una serie puede ser creada utilizando la clase Series
de la librería con una lista de elementos como argumento. Por ejemplo:
import pandas as pd
serie = pd.Series([1, 2, 3, 4, 5])
serie
Esto creará una serie con los elementos 1, 2, 3, 4 y 5. Además, al no haber incluido información sobre los índices, se genera uno automático empezando en 0. Si quisiéramos crear una nueva serie con un índice concreto se programaría como sigue:
serie = pd.Series([1, 2, 3, 4, 5], index = ["a", "b", "c", "d", "e"])
serie
De esta forma, la serie anterior tiene un índice compuesto por letras.
Ambas series almacenan los mismos valores, pero la forma en la que se accede puede variar según el índice.
En una serie se puede acceder a sus elementos por índice o por posición (esto último es lo que hacíamos en NumPy). A continuación se muestran algunas operaciones que se pueden realizar utilizando la serie anterior:
# Acceder al tercer elemento
print(serie["c"]) # Por índice
print(serie[2]) # Por posición
# Cambiar el valor del segundo elemento
serie["b"] = 7
print(serie)
# Sumar 10 a todos los elementos
serie += 10
print(serie)
# Calcular la suma de los elementos
sum_all = serie.sum()
print(sum_all)
Un DataFrame en Pandas es una estructura de datos bidimensional etiquetada. Es similar a un array de 2D de NumPy, pero tiene un índice que permite el acceso a los valores por etiqueta por fila y columna.
Un DataFrame en Pandas tiene varias partes diferenciadas:
Un DataFrame puede verse como un conjunto de series unidas en una estructura tabular, con un índice por fila en común y un índice de columna propio de cada serie.
Un DataFrame puede ser creado utilizando la clase DataFrame
. Por ejemplo:
dataframe = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
dataframe
Esto creará un DataFrame con tres filas y tres columnas cada fila. Al igual que sucedía con las series, un DataFrame generará índices automáticos para filas y columnas si no se pasan como argumento en el constructor de la clase. Si quisiéramos crear un nuevo DataFrame con índices concretos para filas y columnas se programaría como sigue:
data = {
"col A": [1, 2, 3],
"col B": [4, 5, 6],
"col C": [7, 8, 9]
}
dataframe = pd.DataFrame(data, index = ["a", "b", "c"])
dataframe
De esta forma se proporciona un índice personalizado para las columnas (etiquetando las filas dentro de un diccionario) y para las filas (con el argumento index
tal y como sucedía con las series).
En un DataFrame se puede acceder a sus elementos por índice o por posición. A continuación se muestran algunas operaciones que se pueden realizar utilizando el DataFrame anterior:
# Acceder a todos los datos de una columna
print(dataframe["col A"]) # Por índice
print(dataframe.loc[:,"col A"]) # Por índice
print(dataframe.iloc[:,0]) # Por posición
# Acceder a todos los datos de una fila
print(dataframe.loc["a"]) # Por índice
print(dataframe.iloc[0]) # Por posición
# Acceder a un elemento (fila, columna) concreto
print(dataframe.loc["a", "col A"]) # Por índice
print(dataframe.iloc[0, 0]) # Por posición
# Crear una nueva columna
dataframe["col D"] = [10, 11, 12]
print(dataframe)
# Crear una nueva fila
dataframe.loc["d"] = [13, 14, 15, 16]
print(dataframe)
# Multiplicar por 10 los elementos de una columna
dataframe["col A"] *= 10
print(dataframe)
# Calcular la suma de todos los elementos
sum_all = dataframe.sum()
print(sum_all)
Pandas proporciona una gran cantidad de funciones predefinidas y que se pueden aplicar sobre las estructuras de datos vistas anteriormente. Algunas de las más utilizadas en el análisis de datos son:
import pandas as pd
s1 = pd.Series([1, 2, 3])
s2 = pd.Series([4, 5, 6])
d1 = pd.DataFrame([[1, 2, 3], [4, 5, 6]])
d2 = pd.DataFrame([[7, 8, 9], [10, 11, 12]])
# Operaciones Aritméticas
print("Suma de series:", s1.add(s2))
print("Suma de DataFrames:", d1.add(d2))
# Operaciones Estadísticas
# Se pueden aplicar de igual forma a los DataFrames
print("Media:", s1.mean())
print("Mediana:", s1.median())
print("Número de elementos:", s1.count())
print("Desviación estándar:", s1.std())
print("Varianza:", s1.var())
print("Máximo valor:", s1.max())
print("Mínimo valor:", s1.min())
print("Correlación:", s1.corr(s2))
print("Resumen estadístico:", s1.describe())
Además de las funciones predefinidas de Pandas, también se pueden definir y aplicar otras a las estructuras de datos. Para ello, tenemos que programar la función para que reciba un valor (o una columna o fila en el caso de un DataFrame) y devuelva otro modificado, y referenciarla con apply
.
Además, esta función permite utilizar expresiones lambda (lambda expressions) para la declaración anónima de funciones.
A continuación se muestra cómo aplicar funciones a las series:
import pandas as pd
s = pd.Series([1, 2, 3, 4])
# Definición explícita de la función
def squared(x):
return x ** 2
s1 = s.apply(squared)
print(s1)
# Definición anónima de la función
s2 = s.apply(lambda x: x ** 2)
print(s2)
A continuación se muestra cómo aplicar funciones a un DataFrame, que puede hacerse por fila, por columna o por elementos, similar a las series:
df = pd.DataFrame({
"A": [1, 2, 3],
"B": [4, 5, 6]
})
# Aplicar función a lo largo de una columna
df["A"] = df["A"].apply(lambda x: x ** 2)
print(df)
# Aplicar función a lo largo de una fila
df.loc[0] = df.loc[0].apply(lambda x: x ** 2)
print(df)
# Aplicar función a todos los elementos
df = df.applymap(lambda x: x ** 2)
print(df)
apply
es más flexible que otras funciones vectorizadas de Pandas, pero puede ser más lenta, especialmente cuando se aplica a grandes conjuntos de datos. Siempre es importante explorar las funciones incorporadas de Pandas o NumPy primero, ya que suelen ser más eficientes que las que podríamos llegar a implementar nosotros.
Además, esta función puede devolver resultados de diferentes formas, dependiendo de la función aplicada y de cómo esté configurada.
Haz clic en el botón "Abrir en Colab" que se encuentra al principio de esta lección, para poder realizar los ejercicios en Google Collab.
En el siguiente enlace puedes conseguir las soluciones a los ejercicios de pandas python que encontraras mas abajo.
🔥 We also recommend you to complete this interactive and self-corrected Pandas tutorial accompanied by our AI mentor Rigobot, who will answer all your questions instantly.
NOTA: Revisa la clase
pd.Series
(https://pandas.pydata.org/docs/reference/api/pandas.Series.html)
NOTA: Revisa la clase
pd.DataFrame
(https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html)
NOTA: Revisa las funciones
pd.concat
(https://pandas.pydata.org/docs/reference/api/pandas.concat.html) ypd.Series.to_frame
(https://pandas.pydata.org/docs/reference/api/pandas.Series.to_frame.html)
NOTA: Revisa la función
pd.Series.isin
(https://pandas.pydata.org/docs/reference/api/pandas.Series.isin.html)
NOTA: Revisa la función
pd.DataFrame.sort_values
(https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html)
N_column
donde N
es el número de la columna (★★☆)¶NOTA: Revisa la función
pd.DataFrame.sort_values
(https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html)
NOTA: Revisa la función
pd.DataFrame.sort_values
(https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html)