Pandas#
Pandas es una librería para manipulación y análisis de datos.
Instalación: pip install pandas
Las librerías se importan en Python con import
.
import pandas
Con pandas podemos convertir variables en Data Frames
. Estos son un
conjunto de vectores con un index asociado. Cada columna tiene un nombre
al igual que las filas.
x = [28, 25, 10]
x = pandas.DataFrame(x)
Usualmente cada librería se importa y se le asigna un alias para que sea
más fácil de usar, por ejemplo, pandas se importa como pd
. Para
utilizar pandas ya no sería necesario escribir la palabra panda
, en
su lugar se escribe pd
.
import pandas as pd
x = pd.DataFrame(x)
Pandas Series:#
Un Panda Series
es un matriz unidimensional que contiene cualquier
tipo de datos, es decir, es una colummna en un tabla.
x = [28, 25, 10]
serie = pd.Series(x)
print(serie)
0 28
1 25
2 10
dtype: int64
Si no se especifica, el index aparecerá desde el valor del cero [0]
.
Para acceder al primer valor se usa lo siguiente:
serie[0]
28
El segundo elemento se puede extraer así:
serie[1]
25
Para que el index tenga un nombre se usa el argumento index =
.
serie = pd.Series(x, index=["Primera fila", "Segunda fila", "Tercera fila"])
print(serie)
Primera fila 28
Segunda fila 25
Tercera fila 10
dtype: int64
Con estas etiquetas creadas en el index se puede acceder a los elementos por el nombre del index así:
serie["Tercera fila"]
10
DataFrames:#
Las Series
son una columna de una tabla, un DataFrame
es una
tabla completa de 2 dimensiones.
Dataframe: Es una estructura bidimensional mutable de datos con los ejes etiquetados donde:
Cada fila representa una observación diferente.
Cada columna representa una variable diferente.
Vamos a crear un DataFrame de 5 filas y 2 columnas a partir de un diccionario.
Para ello, primero creamos un diccionario donde las claves serán los nombres de las columnas y los valores serán listas, con tantos elementos como número de filas queramos.
Finalmente, convertimos ese diccionario a DataDrame con la función
DataFrame()
de pandas
.
data = {"x": [1, 2, 3, 4, 5], "y": [2, 4, 6, 8, 10]}
df = pd.DataFrame(data)
print(df)
x y
0 1 2
1 2 4
2 3 6
3 4 8
4 5 10
Ahora vamos a crear un DataFrame a partir de una lista de listas.
y = [[51, 21, 54], [1, 2, 3]] # Esta es la lista de listas
y
[[51, 21, 54], [1, 2, 3]]
type(y)
list
df = pd.DataFrame(y)
print(df)
0 1 2
0 51 21 54
1 1 2 3
type(df)
pandas.core.frame.DataFrame
Podemos crear también el DataFrame a partir de una lista de lista
indicando el nombre de las columnas con columns
.
df = pd.DataFrame([[51, 21, 54], [1, 2, 3]], columns=["x", "y", "z"])
print(df)
x y z
0 51 21 54
1 1 2 3
Para asignar los nombres a las filas lo hacemos con ´index´.
df = pd.DataFrame(
[[51, 21, 54], [1, 2, 3]],
columns=["x", "y", "z"],
index=["Observación 1", "Observación 2"],
)
print(df)
x y z
Observación 1 51 21 54
Observación 2 1 2 3
Dimensiones del DataFrame:
Con el método .shape
podemos calcular las dimensiones (número de
filas y columnas) del DataFrame.
df.shape
(2, 3)
Con el método .size
calculamos el número total de elementos que
tiene el DataFrame (número de filas por número de columnas).
df.size
6
Finalmente, con el método .ndim
calculamos el número de dimensiones
que tiene el DataDrame, siempre valdrá 2, pues consta de filas y
columnas.
df.ndim
2
SubDataFrames:#
Dado un DataFrame, un subDataFrame es la selección de unas filas y columnas en particular.
Columnas:
Dado un DataFrame, podemos seleccionar una columna en particular de diversas formas:
Indicando el nombre de la columna entre corchetes
[]
Con el método
.columns[]
Con el método
.loc[]
(por nombre o etiqueta).Con el método
.iloc[]
(por posición).
data = {
"Name": ["Alicia", "Bill", "Carlos", "Diana"],
"Age": [22, 28, 19, 34],
"Pet": [True, False, False, True],
"Height": [157, 190, 175, 164],
"Birthday": ["Mayo", "Junio", "Agosto", "Diciembre"],
}
df = pd.DataFrame(data=data, index=["obs1", "obs2", "obs3", "obs4"])
print(df)
Name Age Pet Height Birthday
obs1 Alicia 22 True 157 Mayo
obs2 Bill 28 False 190 Junio
obs3 Carlos 19 False 175 Agosto
obs4 Diana 34 True 164 Diciembre
Selección de una columna por nombre:
df["Age"]
obs1 22
obs2 28
obs3 19
obs4 34
Name: Age, dtype: int64
Selección de una columna con .columns[]
:
df[df.columns[1]]
obs1 22
obs2 28
obs3 19
obs4 34
Name: Age, dtype: int64
Selección de una columna con .loc[]
:
.loc[filas:columnas]
, el símbolo :
indica todas las filas o
todas las columnas.
df.loc[:, "Age"]
obs1 22
obs2 28
obs3 19
obs4 34
Name: Age, dtype: int64
Selección de una columna con .iloc[]
:
print(df.iloc[:, 1])
obs1 22
obs2 28
obs3 19
obs4 34
Name: Age, dtype: int64
Selección de varias columnas por nombre:
print(df[["Name", "Age"]])
Name Age
obs1 Alicia 22
obs2 Bill 28
obs3 Carlos 19
obs4 Diana 34
Selección de varias columnas con .columns[]
:
print(df[df.columns[[0, 1]]])
Name Age
obs1 Alicia 22
obs2 Bill 28
obs3 Carlos 19
obs4 Diana 34
Otra forma: podemos usar el string :
para seleccionar varias
columnas que están seguidas.
Note que con [0:3]
se seleccionar las columnas desde las 0
hasta
la 2
, no toma la columna 3
.
print(df[df.columns[0:3]])
Name Age Pet
obs1 Alicia 22 True
obs2 Bill 28 False
obs3 Carlos 19 False
obs4 Diana 34 True
print(df[df.columns[2:4]]) # No selecciona la columna 4, solo hasta la 3
Pet Height
obs1 True 157
obs2 False 190
obs3 False 175
obs4 True 164
Selección de varias columnas con .loc[]
:
print(df.loc[:, ["Name", "Age"]])
Name Age
obs1 Alicia 22
obs2 Bill 28
obs3 Carlos 19
obs4 Diana 34
Otra forma:
print(df.loc[:, "Name":"Height"])
Name Age Pet Height
obs1 Alicia 22 True 157
obs2 Bill 28 False 190
obs3 Carlos 19 False 175
obs4 Diana 34 True 164
Selección de varias columnas con .iloc[]
:
print(df.iloc[:, [0, 1]])
Name Age
obs1 Alicia 22
obs2 Bill 28
obs3 Carlos 19
obs4 Diana 34
print(df.iloc[:, 0:4]) # No selecciona la columna 4
Name Age Pet Height
obs1 Alicia 22 True 157
obs2 Bill 28 False 190
obs3 Carlos 19 False 175
obs4 Diana 34 True 164
print(df.iloc[:, 0:5]) # Si selecciona la columna 4
Name Age Pet Height Birthday
obs1 Alicia 22 True 157 Mayo
obs2 Bill 28 False 190 Junio
obs3 Carlos 19 False 175 Agosto
obs4 Diana 34 True 164 Diciembre
Filas:
Dado un DataFrame, podemos seleccionar una fila en particular de diversas formas:
Con el método
.loc[]
(por nombre o etiqueta).Con el método
.iloc[]
(por posición).
Selección de filas con .loc[]
:
Una fila:
print(df.loc["obs1"])
Name Alicia
Age 22
Pet True
Height 157
Birthday Mayo
Name: obs1, dtype: object
Varias filas:
print(df.loc[["obs2", "obs3"]])
Name Age Pet Height Birthday
obs2 Bill 28 False 190 Junio
obs3 Carlos 19 False 175 Agosto
print(df.loc["obs2":"obs4"])
Name Age Pet Height Birthday
obs2 Bill 28 False 190 Junio
obs3 Carlos 19 False 175 Agosto
obs4 Diana 34 True 164 Diciembre
Selección de filas con .iloc[]
:
Una fila:
print(df.iloc[[1]])
Name Age Pet Height Birthday
obs2 Bill 28 False 190 Junio
Varias filas:
print(df.iloc[[1, 2]])
Name Age Pet Height Birthday
obs2 Bill 28 False 190 Junio
obs3 Carlos 19 False 175 Agosto
print(df.iloc[1:3]) # No toma la fila 3
Name Age Pet Height Birthday
obs2 Bill 28 False 190 Junio
obs3 Carlos 19 False 175 Agosto
Filas y columnas:
Para seleccionar un elemento en concreto, hay que indicar la fila y la columna y lo podemos hacer de dos formas:
Con el método
.loc[]
(por nombre o etiqueta).Con el método
.iloc[]
(por índice).
print(df.loc["obs2", "Age"])
28
print(df.iloc[1, 1])
28
Si queremos seleccionar un subconjunto de filas y columnas, podemos utilizar los dos métodos anteriores.
print(df.loc["obs2":"obs3", ["Name", "Birthday"]])
Name Birthday
obs2 Bill Junio
obs3 Carlos Agosto
print(df.iloc[1:3, [0, 4]])
Name Birthday
obs2 Bill Junio
obs3 Carlos Agosto
Cargar archivos con Pandas:#
Para archivos con formato csv se usa pd.read_csv()
.
Guarde el archivo en el formato
CSV UTF-8 (delimitado por comas) (*.csv)
df = pd.read_csv("DatosCafe.csv", sep=";")
print(df.head())
Unnamed: 0 PrecioInterno PrecioInternacional Producción Exportaciones 0 ene-00 371375 130,12 658 517 1 feb-00 354297 124,72 740 642 2 mar-00 360016 119,51 592 404 3 abr-00 347538 112,67 1055 731 4 may-00 353750 110,31 1114 615 TRM EUR 0 1923,57 1916 1 1950,64 1878,5 2 1956,25 1875 3 1986,77 1832 4 2055,69 1971,5
Los decimales están separados por ,
. Agregar decimal = ","
df = pd.read_csv("DatosCafe.csv", sep=";", decimal=",")
print(df)
Unnamed: 0 PrecioInterno PrecioInternacional Producción Exportaciones 0 ene-00 371375.00 130.12 658 517.00 1 feb-00 354297.00 124.72 740 642.00 2 mar-00 360016.00 119.51 592 404.00 3 abr-00 347538.00 112.67 1055 731.00 4 may-00 353750.00 110.31 1114 615.00 .. ... ... ... ... ... 259 ago-21 1704806.45 228.95 915 1130.97 260 sep-21 1712138.00 248.61 1209 1089.83 261 oct-21 1784935.48 270.27 1012 986.83 262 nov-21 1999655.17 291.93 1131 1135.45 263 dic-21 2116483.87 302.82 1385 1167.18 TRM EUR 0 1923.57 1916.0 1 1950.64 1878.5 2 1956.25 1875.0 3 1986.77 1832.0 4 2055.69 1971.5 .. ... ... 259 3887.68 4447.0 260 3820.28 4407.0 261 3771.68 4344.0 262 3900.51 4526.0 263 3967.77 4622.0 [264 rows x 7 columns]
type(df)
pandas.core.frame.DataFrame
len(df)
264
Primera fila del DataFrame:
df.loc[0]
Unnamed: 0 ene-00
PrecioInterno 371375.0
PrecioInternacional 130.12
Producción 658
Exportaciones 517.0
TRM 1923.57
EUR 1916.0
Name: 0, dtype: object
Tres filas específicas del DataFrame:
print(df.loc[[1, 3, 4]])
Unnamed: 0 PrecioInterno PrecioInternacional Producción Exportaciones 1 feb-00 354297.0 124.72 740 642.0 3 abr-00 347538.0 112.67 1055 731.0 4 may-00 353750.0 110.31 1114 615.0 TRM EUR 1 1950.64 1878.5 3 1986.77 1832.0 4 2055.69 1971.5
Análisis de DataFrames con Pandas:#
Para visualizar las primeras 5 filas del DataFrame usamos head()
así:
print(df.head())
Unnamed: 0 PrecioInterno PrecioInternacional Producción Exportaciones 0 ene-00 371375.0 130.12 658 517.0 1 feb-00 354297.0 124.72 740 642.0 2 mar-00 360016.0 119.51 592 404.0 3 abr-00 347538.0 112.67 1055 731.0 4 may-00 353750.0 110.31 1114 615.0 TRM EUR 0 1923.57 1916.0 1 1950.64 1878.5 2 1956.25 1875.0 3 1986.77 1832.0 4 2055.69 1971.5
Para las primeras 11 filas:
print(df.head(11))
Unnamed: 0 PrecioInterno PrecioInternacional Producción Exportaciones 0 ene-00 371375.0 130.12 658 517.0 1 feb-00 354297.0 124.72 740 642.0 2 mar-00 360016.0 119.51 592 404.0 3 abr-00 347538.0 112.67 1055 731.0 4 may-00 353750.0 110.31 1114 615.0 5 jun-00 341688.0 100.30 1092 869.0 6 jul-00 345190.0 101.67 811 721.0 7 ago-00 330113.0 91.87 436 938.0 8 sep-00 330000.0 89.97 501 674.0 9 oct-00 330000.0 90.25 940 831.0 10 nov-00 330000.0 84.01 1366 1200.0 TRM EUR 0 1923.57 1916.0 1 1950.64 1878.5 2 1956.25 1875.0 3 1986.77 1832.0 4 2055.69 1971.5 5 2120.17 2053.5 6 2161.34 2014.5 7 2187.38 1970.5 8 2213.76 1954.0 9 2176.61 1815.0 10 2136.63 1889.0
De la misma manera se puede visualizar las últimas filas, pero con
tail()
.
print(df.tail())
Unnamed: 0 PrecioInterno PrecioInternacional Producción Exportaciones 259 ago-21 1704806.45 228.95 915 1130.97 260 sep-21 1712138.00 248.61 1209 1089.83 261 oct-21 1784935.48 270.27 1012 986.83 262 nov-21 1999655.17 291.93 1131 1135.45 263 dic-21 2116483.87 302.82 1385 1167.18 TRM EUR 259 3887.68 4447.0 260 3820.28 4407.0 261 3771.68 4344.0 262 3900.51 4526.0 263 3967.77 4622.0
Para conocer la información por cada columna del DataFrame se usa
info()
. Muestra la cantidad de datos por columna, si hay datos vacío
y el tipo de dato.
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 264 entries, 0 to 263
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Unnamed: 0 264 non-null object
1 PrecioInterno 264 non-null float64
2 PrecioInternacional 264 non-null float64
3 Producción 264 non-null int64
4 Exportaciones 264 non-null float64
5 TRM 264 non-null float64
6 EUR 264 non-null float64
dtypes: float64(5), int64(1), object(1)
memory usage: 14.6+ KB