Recordemos de la clase pasada el DataFrame...
# Importamos el módulo necesario
import pandas as pd
# Creamos el diccionario
dict1 = {
'País': ['Brazil', 'Rusia', 'India', 'China', 'Japón'],
'Capital': ['Brasilia', 'Moscú', 'Nueva Delhí', 'Beijing', 'Tokio'],
'Población': [200.4, 140, 1300, 1500, 500]
}
# Creamos el DataFrame
d1 = pd.DataFrame(dict1)
# Modificamos el índice por defecto
d1.index = ['BR', 'RU', 'IN', 'CH', 'JA']
# veamos ahora nuestro DataFrame
d1
País | Capital | Población | |
---|---|---|---|
BR | Brazil | Brasilia | 200.4 |
RU | Rusia | Moscú | 140.0 |
IN | India | Nueva Delhí | 1300.0 |
CH | China | Beijing | 1500.0 |
JA | Japón | Tokio | 500.0 |
y podemos ver el tipo de dato que es d1
type(d1)
pandas.core.frame.DataFrame
que indica justamente que d1
es un DataFrame del módulo Pandas.
Podemos acceder a los valores de una columna, por ejemplo de la columna Capital
, escribiendo
d1['Capital']
BR Brasilia RU Moscú IN Nueva Delhí CH Beijing JA Tokio Name: Capital, dtype: object
lo cual nos muestra los valores de la columna capital
, los valores del índice general de nuestro DataFrame y al final nos da el nombre de la columna y el tipo. Vayamos un poco más allá y averiguemos sobre el tipo de d1['Capital']
, veamos que
# usemos la función type sobre d1['Capital']
type(d1['Capital'])
pandas.core.series.Series
lo cual nos arroja que d1['Capital']
es una serie en Pandas, donde una serie puede pensarse como una matriz unidimensional que puede etiquetarse, al igual que un DataFrame. De tal manera, si "juntamos" varias series podremos crear un DataFrame. En resumen, accediendo a los valores de una columna usando corchetes en la sintaxis obtenemos como resultado una serie.
Por otro lado, podemos acceder a los valores de la columna utilizando doble corchete
d1[['Capital']]
Capital | |
---|---|
BR | Brasilia |
RU | Moscú |
IN | Nueva Delhí |
CH | Beijing |
JA | Tokio |
lo cual mantendra la naturaleza de DataFrame, es decir que d1[['Capital']]
continúa siendo un DataFrame (y no es, en este caso, una serie). En efecto
type(d1[['Capital']])
pandas.core.frame.DataFrame
Utilizando la misma idea podemos acceder a los valores de una fila, por ejemplo obtengamos los valores de la fila 0
# para acceder a valores de fila utilizamos intervalos
d1[0:1]
País | Capital | Población | |
---|---|---|---|
BR | Brazil | Brasilia | 200.4 |
# Accedamos a los valores de la fila 1 a la 3
d1[1:4]
País | Capital | Población | |
---|---|---|---|
RU | Rusia | Moscú | 140.0 |
IN | India | Nueva Delhí | 1300.0 |
CH | China | Beijing | 1500.0 |
y notemos que en este caso el resultado continúa siendo un DataFrame
type(d1[1:4])
pandas.core.frame.DataFrame
Accediendo a los valores de filas y columnas de un DataFrame usando corchetes representa una funcionalidad muy limitada. Recordemos de la versatilidad en los arreglos de dos dimensiones en NumPy
, siendo así que busquemos algo parecido en el manejo de los DataFrames.
Para conseguir mayor versatilidad a la hora de acceder a los datos de un DataFrame utilizaremos las funciones loc e iloc. La función loc (label-based) usa una técnica para seleccionar parte de sus datos en función de etiquetas; la función iloc (integer position-based) se basa en la posición.
Veamos por ejemplo el acceso a los valores de la fila Rusia
utilizando la función loc
# Para acceder a la fila que deseamos debemos colocar la etiqueta correspondiente
# al índice del DataFrame
d1.loc['RU']
País Rusia Capital Moscú Población 140.0 Name: RU, dtype: object
lo cual nos arroja nuevamente una serie Pandas con la información un tanto en forma incoveniente. Podemos mejorar lo anterior utilizando doble corchete
d1.loc[['RU']]
País | Capital | Población | |
---|---|---|---|
RU | Rusia | Moscú | 140.0 |
Podemos acceder a valores de más filas
d1.loc[['BR', 'IN']]
País | Capital | Población | |
---|---|---|---|
BR | Brazil | Brasilia | 200.4 |
IN | India | Nueva Delhí | 1300.0 |
Hasta el momento lo anterior no representa algo nuevo respecto al manejo de corchetes para acceder a los datos de un DataFrame, sin embargo, con la función loc podemos acceder además a valores especificos de una columna, es decir, podemos acceder por ejemplo a la fila BR
y obtener sólo el valor correspondiente a la columna Capital
escribiendo
d1.loc[['BR'] , ['Capital']]
Capital | |
---|---|
BR | Brasilia |
o por ejemplo
d1.loc[['BR', 'IN'], ['País', 'Población']]
País | Población | |
---|---|---|
BR | Brazil | 200.4 |
IN | India | 1300.0 |
de modo que los primeros corchetes hacen referencia a valores de las filas y los segundos a valores de las columnas. Además podemos acceder a varias filas utilizando nuevamente intervalos, combinando con lo visto anteriormente
# Accediendo a los valores de las columnas País y Población de todas las filas
d1.loc[:, ['País', 'Población']]
País | Población | |
---|---|---|
BR | Brazil | 200.4 |
RU | Rusia | 140.0 |
IN | India | 1300.0 |
CH | China | 1500.0 |
JA | Japón | 500.0 |
Ahora bien, con la función loc conseguimos gran versatilidad a la hora de acceder a los datos de un DataFrame mediante una búsqueda basada en las etiquetas, luego, mediante iloc conseguiremos lo mismo cambiando de una búsqueda por etiquetas a una búsqueda por posiciones. Abordemos los mismos ejemplo usados para la función loc con la función iloc
# loc
# d1.loc[['RU']]
# -----------------------------------
# iloc
d1.iloc[[1]]
País | Capital | Población | |
---|---|---|---|
RU | Rusia | Moscú | 140.0 |
# loc
# d1.loc[['BR', 'IN']]
# -----------------------------------
# iloc
d1.iloc[[0, 2]]
País | Capital | Población | |
---|---|---|---|
BR | Brazil | Brasilia | 200.4 |
IN | India | Nueva Delhí | 1300.0 |
# loc
# d1.loc[['BR'] , ['Capital']]
# -----------------------------------
# iloc
d1.iloc[[0], [1]]
Capital | |
---|---|
BR | Brasilia |
# loc
# d1.loc[['BR', 'IN'], ['País', 'Población']]
# -----------------------------------
# iloc
d1.iloc[[0, 2], [0, 2]]
País | Población | |
---|---|---|
BR | Brazil | 200.4 |
IN | India | 1300.0 |
# loc
# d1.loc[:, ['País', 'Población']]
# -----------------------------------
# iloc
d1.iloc[:, [0, 2]]
País | Población | |
---|---|---|
BR | Brazil | 200.4 |
RU | Rusia | 140.0 |
IN | India | 1300.0 |
CH | China | 1500.0 |
JA | Japón | 500.0 |