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)

GuardarArchivos

GuardarArchivos#

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