Tutorial de Pandas

Ejecutar este documento en forma dinámica: Binder

pandas es una biblioteca de código abierto, con licencia BSD, que provee estructuras de datos y herramientas de análisis de alto desempeño y fáciles de usar, para el lenguaje de programación Python.

De Wikipedia):

El nombre se deriva de "panel data", un término usual en econometría para conjuntos de datos que incluye observaciones sobre múltiples períodos de tiempo para los mismos individuos.

¿Para qué sirve pandas?

pandas es, principalmente, un contenedor de datos que permite explorarlos, limpiarlos, transformarlos y analizarlos.

Por ejemplo, podemos querer explorar datos almacenados en un archivo CSV. pandas puede extraer esa información y almacenarla en un dataset (que es básicamente una tabla), y luego realizar tareas como:

  • Calcular estadísticas y responder cuestiones sobre los datos, como:

    • ¿Cuál es la media, mediana, máximo, mínimo de cada columna?
    • ¿Hay correlación entre la columna A y la columna B?
    • ¿Qué aspecto tiene la distribución de datos de la columna C?
  • Limpieza de datos (remover valores perdidos, filtrado de filas o columnas con algún criterio)

  • Visualización de los datos con ayuda de Matplotlib o Seaborn. Se pueden graficar barras, líneas, histogramas, burbujas y más.

  • Almacenar los datos limpios y transformados en un nuevo CSV, otro archivo o una base de datos.

pandas está construido sobre el paquete NumPy, por lo que mucho de la estructura de NumPy se utiliza o se replica en pandas. Los datos en pandas se usan frecuentemente para análisis estadístico en SciPy, para graficar funciones con Matplotlib o Seaborn, y para algoritmos de machine learning en Scikit-learn.

Aumento de popularidad de pandas

popularidad

Instalación e importación

Para instalar pandas en Linux, simplemente hay que abrir una terminal, tener permisos de root, y poner:

apt install python3-pandas

Para importar pandas en un script, usualmente se lo utiliza con:

In [1]:
import pandas as pd

Componentes principales de pandas: Series y DataFrames

Los dos componentes primarios de pandas son las Series y los DataFrame.

Una Series es esencialmente una columna, y un DataFrame es una tabla mutidimensional construida a partir de una colección de Series.

Series y DataFrame

DataFrames y Series son muy similares, dado que muchas operaciones que se pueden hacer con una se pueden hacer con las otras, tal como llenarlas con valores y calcular la media.

Veremos a continuación cómo crear Series y DataFrames, y luego cómo operar con ellas.

Creación de DataFrames desde cero

Crear DataFrames desde Python es útil cuando queremos organizar datos generados desde el mismo programa, en vez de importar los datos desde un archivo externo (que veremos en breve).

Hay muchas formas de crear un DataFrame desde cero, pero tal vez la más simple sea hacerlo usando un diccionario.

Supongamos que tenemos una veterinaria que administra turnos para atender gatos y perros. Queremos tener una columna para cada especie y filas para cada día. Para organizar esta información como un diccionario podemos hacer:

In [2]:
data = {'Perros': [4, 1, 0, 2],
        'Gatos': [2, 0, 7, 3]}

Podemos entonces pasar este diccionario al constructor de DataFrames en pandas:

In [3]:
turnos = pd.DataFrame(data)
turnos
Out[3]:
Perros Gatos
0 4 2
1 1 0
2 0 7
3 2 3

Cada par (clave, valor) en data corresponde a una columna en el DataFrame resultante.

El índice en este DataFrame fue creado automáticamente con los números 0...3, pero podemos crear nuestros propios índices cuando inicializamos el DataFrame.

Por ejemplo, podemos poner días de la semana como índices:

In [4]:
turnos = pd.DataFrame(data, index=['Lunes', 'Martes', 'Miércoles', 'Jueves'])
turnos
Out[4]:
Perros Gatos
Lunes 4 2
Martes 1 0
Miércoles 0 7
Jueves 2 3

Entonces, podemos localizar los turnos de un día usando su nombre:

In [5]:
turnos.loc['Jueves']
Out[5]:
Perros    2
Gatos     3
Name: Jueves, dtype: int64

Veremos más sobre cómo localizar y extraer datos de un DataFrame, pero ahora ya sabemos cómo crear y llenar con datos aleatorios un DataFrame para aprender.

Lectura de datos desde archivos

Es muy simple importar datos a un DataFrame a partir de un archivo CSV. Se realiza esta operación con una sola línea:

In [6]:
df = pd.read_csv('turnos.csv')
df
Out[6]:
Unnamed: 0 Perros Gatos
0 Lunes 4 3
1 Martes 1 0
2 Miércoles 0 7
3 Jueves 2 3
4 Viernes 5 4
5 Sábado 8 6

Los archivos CSV no tienen índices como los DataFrames, por lo que es necesario establecer el index_col cuando importamos los datos:

In [7]:
df = pd.read_csv('turnos.csv', index_col=0)
df
Out[7]:
Perros Gatos
Lunes 4 3
Martes 1 0
Miércoles 0 7
Jueves 2 3
Viernes 5 4
Sábado 8 6

Es posible importar datos desde archivos con otras estructuras mas complejas que los CSV, como JSON o SQL, pero no nos ocuparemos de esos archivos aquí.

Principales operaciones en DataFrames

Las DataFrames poseen cientos de métodos y otras operaciones que son útiles para realizar análisis de los datos. Veremos a continuación las operaciones que sirven para realizar transformaciones simples de los datos y aquéllas que proveen análisis estadísticos sencillos.

Comenzaremos importando datos de las mil películas mas populares en el intervalo 2006-2016:

In [8]:
movies_df = pd.read_csv('IMDB-Movie-Data.csv', index_col='Title')

Exploración de los datos

La primera acción a realizar cuando importamos un nuevo conjunto de datos es imprimir unas pocas filas para tener una referencia visual. Podemos hacer esto con el método head():

In [9]:
movies_df.head()
Out[9]:
Rank Genre Description Director Actors Year Runtime (Minutes) Rating Votes Revenue (Millions) Metascore
Title
Guardians of the Galaxy 1 Action,Adventure,Sci-Fi A group of intergalactic criminals are forced ... James Gunn Chris Pratt, Vin Diesel, Bradley Cooper, Zoe S... 2014 121 8.1 757074 333.13 76.0
Prometheus 2 Adventure,Mystery,Sci-Fi Following clues to the origin of mankind, a te... Ridley Scott Noomi Rapace, Logan Marshall-Green, Michael Fa... 2012 124 7.0 485820 126.46 65.0
Split 3 Horror,Thriller Three girls are kidnapped by a man with a diag... M. Night Shyamalan James McAvoy, Anya Taylor-Joy, Haley Lu Richar... 2016 117 7.3 157606 138.12 62.0
Sing 4 Animation,Comedy,Family In a city of humanoid animals, a hustling thea... Christophe Lourdelet Matthew McConaughey,Reese Witherspoon, Seth Ma... 2016 108 7.2 60545 270.32 59.0
Suicide Squad 5 Action,Adventure,Fantasy A secret government agency recruits some of th... David Ayer Will Smith, Jared Leto, Margot Robbie, Viola D... 2016 123 6.2 393727 325.02 40.0

.head() muestra por defecto las últimas cinco filas del DataFrame. Es posible modificar este número pasándole como argumento un entero: movies_df.head(10) mostrará las primeras 10 filas del DataFrame.

Para ver las últimas cinco filas podemos usar el método .tail(), que también acepta un entero como argumento. Por ejemplo, si queremos ver las últimas dos filas del DataFrame, podemos usar:

In [10]:
movies_df.tail(2)
Out[10]:
Rank Genre Description Director Actors Year Runtime (Minutes) Rating Votes Revenue (Millions) Metascore
Title
Search Party 999 Adventure,Comedy A pair of friends embark on a mission to reuni... Scot Armstrong Adam Pally, T.J. Miller, Thomas Middleditch,Sh... 2014 93 5.6 4881 NaN 22.0
Nine Lives 1000 Comedy,Family,Fantasy A stuffy businessman finds himself trapped ins... Barry Sonnenfeld Kevin Spacey, Jennifer Garner, Robbie Amell,Ch... 2016 87 5.3 12435 19.64 11.0

Es importante, al importar un conjunto de datos, visualizar las primeras filas para inspeccionar los nombres de las columnas, el índice, y ejemplos de valores en cada fila.

Puede observarse que el índice en el DataFrame es la columna Title, que aparece más abajo que el resto de las cabeceras de las demás columnas.

En el caso de las variables categóricas, es posible obtener para una dada columna todos los valores distintos utilizando el método .unique(). Por ejemplo, si quisieramos obtener un array con todos los directores que aparecen en el DataFrame podemos hacer:

In [11]:
directores = movies_df['Director'].unique()
directores[:10]
Out[11]:
array(['James Gunn', 'Ridley Scott', 'M. Night Shyamalan',
       'Christophe Lourdelet', 'David Ayer', 'Yimou Zhang',
       'Damien Chazelle', 'Sean Foley', 'James Gray', 'Morten Tyldum'],
      dtype=object)

Información sobre los datos

Uno de los primeros métodos que se usan regularmente sobre los DataFrames luego de importar los datos es .info():

In [12]:
movies_df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 1000 entries, Guardians of the Galaxy to Nine Lives
Data columns (total 11 columns):
Rank                  1000 non-null int64
Genre                 1000 non-null object
Description           1000 non-null object
Director              1000 non-null object
Actors                1000 non-null object
Year                  1000 non-null int64
Runtime (Minutes)     1000 non-null int64
Rating                1000 non-null float64
Votes                 1000 non-null int64
Revenue (Millions)    872 non-null float64
Metascore             936 non-null float64
dtypes: float64(3), int64(4), object(4)
memory usage: 93.8+ KB

.info() provee los detalles esenciales del conjunto de datos, tal como el número de filas y columnas, el número de valores no nulos, el tipo de dato en cada columna y cuanta memoria es utilizada por el DataFrame.

Otro atributo útil y rápido es .shape, que devuelve una tupla de (filas, columnas):

In [13]:
movies_df.shape
Out[13]:
(1000, 11)

Es frecuente utilizar .shape cuando se limpian o transforman los datos. Por ejemplo, podríamos filtrar algunas filas según un criterio dado y luego querer saber cuántas filas fueron removidas.

Manipulación de duplicados

Este DataFrame no tiene filas duplicadas, pero siempre es importante verificar que no estamos agregando filas duplicadas.

Para demostrar esto, vamos a duplicar las películas en el DataFrame agregándolo a si mismo:

In [14]:
temp_df = movies_df.append(movies_df)
temp_df.shape
Out[14]:
(2000, 11)

.append() devuelve una copia sin afectar el DataFrame original. Estamos asignando esta copia en temp_df de modo de no trabajar con los datos originales.

Notar que .shape muestra rápidamente que las filas del DataFrame se duplicaron. Podemos ahora eliminar las filas duplicadas:

In [15]:
temp_df = temp_df.drop_duplicates()
temp_df.shape
Out[15]:
(1000, 11)

Al igual que .append(), .drop_duplicates() también devuelve una copia del DataFrame, pero con las filas duplicadas removidas. Invocando .shape confirmamos que volvemos a las mil filas de nuestros datos originales.

Resulta redundante asignar DataFrames a la misma variable como en este ejemplo. Por esta razón, pandas tiene el agrumento con nombre inplace en muchos de sus métodos. Utilizando inplace=True se modificará el objeto DataFrame mismo:

In [16]:
temp_df.drop_duplicates(inplace=True)

Otro argumento importante de .drop_duplicates() es keep, que tiene tres opciones posibles:

  • first: Elimina duplicados excepto la primera ocurrencia (por defecto).
  • last: Elimina duplicados excepto la última ocurrencia.
  • False: Elimina todos los duplicados.

Dado que no definimos el argumento keep en el ejemplo, por defecto usa first. Esto significa que si dos filas son iguales, pandas eliminará la segunda y mantendrá la primera. Usando last se obtiene el efecto opuesto: se elimina la primer fila.

Por otra parte, False eliminará todos los duplicados. Si dos filas son iguales se eliminarán ambas. Por ejemplo:

In [17]:
temp_df = movies_df.append(movies_df)
temp_df.shape
temp_df.drop_duplicates(inplace=True, keep=False)
temp_df.shape
Out[17]:
(0, 11)

Limpieza de columnas

Muchos conjuntos de datos tienen nombres de columnas con símbolos, palabras en mayúsculas y minúsculas, espacios y errores tipográficos. Para seleccionar datos por columna de una forma más simple, es posible perder un poco de tiempo limpiando sus nombres.

Para obtener los nombres de las columnas del DataFrame podemos usar .columns:

In [18]:
movies_df.columns
Out[18]:
Index(['Rank', 'Genre', 'Description', 'Director', 'Actors', 'Year',
       'Runtime (Minutes)', 'Rating', 'Votes', 'Revenue (Millions)',
       'Metascore'],
      dtype='object')

.columns es útil para renombrar columnas usando simplemente copiar y pegar, pero también es útil para entender por qué obtenemos un Key error cuando seleccionamos datos por columna.

Podemos usar .rename() para cambiar alguna o todas las columnas mediante un diccionario. Por ejemplo, si queremos eliminar los paréntesis, podemos usar:

In [19]:
movies_df.rename(columns={
    'Runtime (Minutes)':'Runtime',
    'Revenue (Millions)': 'Revenue_millions'
}, inplace=True)
movies_df.columns
Out[19]:
Index(['Rank', 'Genre', 'Description', 'Director', 'Actors', 'Year', 'Runtime',
       'Rating', 'Votes', 'Revenue_millions', 'Metascore'],
      dtype='object')

En caso que necesitemos tener en minúsculas todos los nombres de las columnas, podemos combinar .columns con comprensiones de listas:

In [20]:
movies_df.columns = [name.lower() for name in movies_df.columns]
movies_df.columns
Out[20]:
Index(['rank', 'genre', 'description', 'director', 'actors', 'year', 'runtime',
       'rating', 'votes', 'revenue_millions', 'metascore'],
      dtype='object')

Las comprensiones de listas (y de diccionarios) son muy útiles para trabajar con pandas y datos. Suele ser una buena idea pasar los nombres de columnas a minúsculas, remover caracteres especiales, y reemplazar espacios con guiones bajos, si es necesario trabajar con un DataFrame por un tiempo.

Cómo trabajar con valores perdidos

Al explorar los datos es probable encontrar que faltan algunos valores o son null. Lo más frecuente de ver son los None de Python o los np.nan de NumPy, cada uno de los cuales son manipulados en forma diferente en algunas situaciones.

Hay dos opciones para resolver los nulls:

  1. Eliminar las filas o columnas con nulls.
  2. Reemplazar nulls con valores no-null, una técnica conocida como imputación.

Veamos el número total de nulls en nuestro conjunto de datos. El primer paso es verificar cuántas celdas en nuestro DataFrame son null:

In [21]:
movies_df.isnull()
Out[21]:
rank genre description director actors year runtime rating votes revenue_millions metascore
Title
Guardians of the Galaxy False False False False False False False False False False False
Prometheus False False False False False False False False False False False
Split False False False False False False False False False False False
Sing False False False False False False False False False False False
Suicide Squad False False False False False False False False False False False
The Great Wall False False False False False False False False False False False
La La Land False False False False False False False False False False False
Mindhorn False False False False False False False False False True False
The Lost City of Z False False False False False False False False False False False
Passengers False False False False False False False False False False False
Fantastic Beasts and Where to Find Them False False False False False False False False False False False
Hidden Figures False False False False False False False False False False False
Rogue One False False False False False False False False False False False
Moana False False False False False False False False False False False
Colossal False False False False False False False False False False False
The Secret Life of Pets False False False False False False False False False False False
Hacksaw Ridge False False False False False False False False False False False
Jason Bourne False False False False False False False False False False False
Lion False False False False False False False False False False False
Arrival False False False False False False False False False False False
Gold False False False False False False False False False False False
Manchester by the Sea False False False False False False False False False False False
Hounds of Love False False False False False False False False False True False
Trolls False False False False False False False False False False False
Independence Day: Resurgence False False False False False False False False False False False
Paris pieds nus False False False False False False False False False True True
Bahubali: The Beginning False False False False False False False False False False True
Dead Awake False False False False False False False False False False True
Bad Moms False False False False False False False False False False False
Assassin's Creed False False False False False False False False False False False
... ... ... ... ... ... ... ... ... ... ... ...
Texas Chainsaw 3D False False False False False False False False False False False
Disturbia False False False False False False False False False False True
Rock of Ages False False False False False False False False False False False
Scream 4 False False False False False False False False False False False
Queen of Katwe False False False False False False False False False False False
My Big Fat Greek Wedding 2 False False False False False False False False False False False
Dark Places False False False False False False False False False True False
Amateur Night False False False False False False False False False True False
It's Only the End of the World False False False False False False False False False True False
The Skin I Live In False False False False False False False False False False False
Miracles from Heaven False False False False False False False False False False False
Annie False False False False False False False False False False False
Across the Universe False False False False False False False False False False False
Let's Be Cops False False False False False False False False False False False
Max False False False False False False False False False False False
Your Highness False False False False False False False False False False False
Final Destination 5 False False False False False False False False False False False
Endless Love False False False False False False False False False False False
Martyrs False False False False False False False False False True False
Selma False False False False False False False False False False True
Underworld: Rise of the Lycans False False False False False False False False False False False
Taare Zameen Par False False False False False False False False False False False
Take Me Home Tonight False False False False False False False False False False True
Resident Evil: Afterlife False False False False False False False False False False False
Project X False False False False False False False False False False False
Secret in Their Eyes False False False False False False False False False True False
Hostel: Part II False False False False False False False False False False False
Step Up 2: The Streets False False False False False False False False False False False
Search Party False False False False False False False False False True False
Nine Lives False False False False False False False False False False False

1000 rows × 11 columns

Vemos que .isnull() devuelve un DataFrame donde cada celda es True o False dependiendo si la celda contiene un valor null.

Para contar el número de nulls en cada columna, usamos una función de reducción que suma:

In [22]:
movies_df.isnull().sum()
Out[22]:
rank                  0
genre                 0
description           0
director              0
actors                0
year                  0
runtime               0
rating                0
votes                 0
revenue_millions    128
metascore            64
dtype: int64

.isnull() no es muy útil por si mismo, sino que suele utilizarse combinado con otros métodos como .sum().

Vemos que nuestros datos tienen 128 valores perdidos para revenue_millions, y 64 para metascores.

Eliminando valores null

Los analistas suelen enfrentarse regularmente al dilema de eliminar o imputar los valores null, y es una decisión que requiere un conociemiento profundo de los datos y su contexto. Por lo general, remover los datos null se recomienda solo cuando tenemos un número pequeño de datos perdidos.

Eliminar los nulls es muy simple:

In [23]:
movies_df.dropna()
Out[23]:
rank genre description director actors year runtime rating votes revenue_millions metascore
Title
Guardians of the Galaxy 1 Action,Adventure,Sci-Fi A group of intergalactic criminals are forced ... James Gunn Chris Pratt, Vin Diesel, Bradley Cooper, Zoe S... 2014 121 8.1 757074 333.13 76.0
Prometheus 2 Adventure,Mystery,Sci-Fi Following clues to the origin of mankind, a te... Ridley Scott Noomi Rapace, Logan Marshall-Green, Michael Fa... 2012 124 7.0 485820 126.46 65.0
Split 3 Horror,Thriller Three girls are kidnapped by a man with a diag... M. Night Shyamalan James McAvoy, Anya Taylor-Joy, Haley Lu Richar... 2016 117 7.3 157606 138.12 62.0
Sing 4 Animation,Comedy,Family In a city of humanoid animals, a hustling thea... Christophe Lourdelet Matthew McConaughey,Reese Witherspoon, Seth Ma... 2016 108 7.2 60545 270.32 59.0
Suicide Squad 5 Action,Adventure,Fantasy A secret government agency recruits some of th... David Ayer Will Smith, Jared Leto, Margot Robbie, Viola D... 2016 123 6.2 393727 325.02 40.0
The Great Wall 6 Action,Adventure,Fantasy European mercenaries searching for black powde... Yimou Zhang Matt Damon, Tian Jing, Willem Dafoe, Andy Lau 2016 103 6.1 56036 45.13 42.0
La La Land 7 Comedy,Drama,Music A jazz pianist falls for an aspiring actress i... Damien Chazelle Ryan Gosling, Emma Stone, Rosemarie DeWitt, J.... 2016 128 8.3 258682 151.06 93.0
The Lost City of Z 9 Action,Adventure,Biography A true-life drama, centering on British explor... James Gray Charlie Hunnam, Robert Pattinson, Sienna Mille... 2016 141 7.1 7188 8.01 78.0
Passengers 10 Adventure,Drama,Romance A spacecraft traveling to a distant colony pla... Morten Tyldum Jennifer Lawrence, Chris Pratt, Michael Sheen,... 2016 116 7.0 192177 100.01 41.0
Fantastic Beasts and Where to Find Them 11 Adventure,Family,Fantasy The adventures of writer Newt Scamander in New... David Yates Eddie Redmayne, Katherine Waterston, Alison Su... 2016 133 7.5 232072 234.02 66.0
Hidden Figures 12 Biography,Drama,History The story of a team of female African-American... Theodore Melfi Taraji P. Henson, Octavia Spencer, Janelle Mon... 2016 127 7.8 93103 169.27 74.0
Rogue One 13 Action,Adventure,Sci-Fi The Rebel Alliance makes a risky move to steal... Gareth Edwards Felicity Jones, Diego Luna, Alan Tudyk, Donnie... 2016 133 7.9 323118 532.17 65.0
Moana 14 Animation,Adventure,Comedy In Ancient Polynesia, when a terrible curse in... Ron Clements Auli'i Cravalho, Dwayne Johnson, Rachel House,... 2016 107 7.7 118151 248.75 81.0
Colossal 15 Action,Comedy,Drama Gloria is an out-of-work party girl forced to ... Nacho Vigalondo Anne Hathaway, Jason Sudeikis, Austin Stowell,... 2016 109 6.4 8612 2.87 70.0
The Secret Life of Pets 16 Animation,Adventure,Comedy The quiet life of a terrier named Max is upend... Chris Renaud Louis C.K., Eric Stonestreet, Kevin Hart, Lake... 2016 87 6.6 120259 368.31 61.0
Hacksaw Ridge 17 Biography,Drama,History WWII American Army Medic Desmond T. Doss, who ... Mel Gibson Andrew Garfield, Sam Worthington, Luke Bracey,... 2016 139 8.2 211760 67.12 71.0
Jason Bourne 18 Action,Thriller The CIA's most dangerous former operative is d... Paul Greengrass Matt Damon, Tommy Lee Jones, Alicia Vikander,V... 2016 123 6.7 150823 162.16 58.0
Lion 19 Biography,Drama A five-year-old Indian boy gets lost on the st... Garth Davis Dev Patel, Nicole Kidman, Rooney Mara, Sunny P... 2016 118 8.1 102061 51.69 69.0
Arrival 20 Drama,Mystery,Sci-Fi When twelve mysterious spacecraft appear aroun... Denis Villeneuve Amy Adams, Jeremy Renner, Forest Whitaker,Mich... 2016 116 8.0 340798 100.50 81.0
Gold 21 Adventure,Drama,Thriller Kenny Wells, a prospector desperate for a luck... Stephen Gaghan Matthew McConaughey, Edgar Ramírez, Bryce Dall... 2016 120 6.7 19053 7.22 49.0
Manchester by the Sea 22 Drama A depressed uncle is asked to take care of his... Kenneth Lonergan Casey Affleck, Michelle Williams, Kyle Chandle... 2016 137 7.9 134213 47.70 96.0
Trolls 24 Animation,Adventure,Comedy After the Bergens invade Troll Village, Poppy,... Walt Dohrn Anna Kendrick, Justin Timberlake,Zooey Deschan... 2016 92 6.5 38552 153.69 56.0
Independence Day: Resurgence 25 Action,Adventure,Sci-Fi Two decades after the first Independence Day i... Roland Emmerich Liam Hemsworth, Jeff Goldblum, Bill Pullman,Ma... 2016 120 5.3 127553 103.14 32.0
Bad Moms 29 Comedy When three overworked and under-appreciated mo... Jon Lucas Mila Kunis, Kathryn Hahn, Kristen Bell,Christi... 2016 100 6.2 66540 113.08 60.0
Assassin's Creed 30 Action,Adventure,Drama When Callum Lynch explores the memories of his... Justin Kurzel Michael Fassbender, Marion Cotillard, Jeremy I... 2016 115 5.9 112813 54.65 36.0
Why Him? 31 Comedy A holiday gathering threatens to go off the ra... John Hamburg Zoey Deutch, James Franco, Tangie Ambrose,Cedr... 2016 111 6.3 48123 60.31 39.0
Nocturnal Animals 32 Drama,Thriller A wealthy art gallery owner is haunted by her ... Tom Ford Amy Adams, Jake Gyllenhaal, Michael Shannon, A... 2016 116 7.5 126030 10.64 67.0
X-Men: Apocalypse 33 Action,Adventure,Sci-Fi After the re-emergence of the world's first mu... Bryan Singer James McAvoy, Michael Fassbender, Jennifer Law... 2016 144 7.1 275510 155.33 52.0
Deadpool 34 Action,Adventure,Comedy A fast-talking mercenary with a morbid sense o... Tim Miller Ryan Reynolds, Morena Baccarin, T.J. Miller, E... 2016 108 8.0 627797 363.02 65.0
Resident Evil: The Final Chapter 35 Action,Horror,Sci-Fi Alice returns to where the nightmare began: Th... Paul W.S. Anderson Milla Jovovich, Iain Glen, Ali Larter, Shawn R... 2016 107 5.6 46165 26.84 49.0
... ... ... ... ... ... ... ... ... ... ... ...
That Awkward Moment 956 Comedy,Romance Three best friends find themselves where we've... Tom Gormican Zac Efron, Michael B. Jordan, Miles Teller, Im... 2014 94 6.2 81823 26.05 36.0
Legion 957 Action,Fantasy,Horror When a group of strangers at a dusty roadside ... Scott Stewart Paul Bettany, Dennis Quaid, Charles S. Dutton,... 2010 100 5.2 84158 40.17 32.0
End of Watch 958 Crime,Drama,Thriller Shot documentary-style, this film follows the ... David Ayer Jake Gyllenhaal, Michael Peña, Anna Kendrick, ... 2012 109 7.7 192190 40.98 68.0
3 Days to Kill 959 Action,Drama,Thriller A dying CIA agent trying to reconnect with his... McG Kevin Costner, Hailee Steinfeld, Connie Nielse... 2014 117 6.2 73567 30.69 40.0
Lucky Number Slevin 960 Crime,Drama,Mystery A case of mistaken identity lands Slevin into ... Paul McGuigan Josh Hartnett, Ben Kingsley, Morgan Freeman, L... 2006 110 7.8 271940 22.49 53.0
Trance 961 Crime,Drama,Mystery An art auctioneer who has become mixed up with... Danny Boyle James McAvoy, Rosario Dawson, Vincent Cassel,D... 2013 101 7.0 97141 2.32 61.0
Into the Forest 962 Drama,Sci-Fi,Thriller After a massive power outage, two sisters lear... Patricia Rozema Ellen Page, Evan Rachel Wood, Max Minghella,Ca... 2015 101 5.9 10220 0.01 59.0
The Other Boleyn Girl 963 Biography,Drama,History Two sisters contend for the affection of King ... Justin Chadwick Natalie Portman, Scarlett Johansson, Eric Bana... 2008 115 6.7 88260 26.81 50.0
I Spit on Your Grave 964 Crime,Horror,Thriller A writer who is brutalized during her cabin re... Steven R. Monroe Sarah Butler, Jeff Branson, Andrew Howard,Dani... 2010 108 6.3 60133 0.09 27.0
Texas Chainsaw 3D 971 Horror,Thriller A young woman travels to Texas to collect an i... John Luessenhop Alexandra Daddario, Tania Raymonde, Scott East... 2013 92 4.8 37060 34.33 62.0
Rock of Ages 973 Comedy,Drama,Musical A small town girl and a city boy meet on the S... Adam Shankman Julianne Hough, Diego Boneta, Tom Cruise, Alec... 2012 123 5.9 64513 38.51 47.0
Scream 4 974 Horror,Mystery Ten years have passed, and Sidney Prescott, wh... Wes Craven Neve Campbell, Courteney Cox, David Arquette, ... 2011 111 6.2 108544 38.18 52.0
Queen of Katwe 975 Biography,Drama,Sport A Ugandan girl sees her world rapidly change a... Mira Nair Madina Nalwanga, David Oyelowo, Lupita Nyong'o... 2016 124 7.4 6753 8.81 73.0
My Big Fat Greek Wedding 2 976 Comedy,Family,Romance A Portokalos family secret brings the beloved ... Kirk Jones Nia Vardalos, John Corbett, Michael Constantin... 2016 94 6.0 20966 59.57 37.0
The Skin I Live In 980 Drama,Thriller A brilliant plastic surgeon, haunted by past t... Pedro Almodóvar Antonio Banderas, Elena Anaya, Jan Cornet,Mari... 2011 120 7.6 108772 3.19 70.0
Miracles from Heaven 981 Biography,Drama,Family A young girl suffering from a rare digestive d... Patricia Riggen Jennifer Garner, Kylie Rogers, Martin Henderso... 2016 109 7.0 12048 61.69 44.0
Annie 982 Comedy,Drama,Family A foster kid, who lives with her mean foster m... Will Gluck Quvenzhané Wallis, Cameron Diaz, Jamie Foxx, R... 2014 118 5.3 27312 85.91 33.0
Across the Universe 983 Drama,Fantasy,Musical The music of the Beatles and the Vietnam War f... Julie Taymor Evan Rachel Wood, Jim Sturgess, Joe Anderson, ... 2007 133 7.4 95172 24.34 56.0
Let's Be Cops 984 Comedy Two struggling pals dress as police officers f... Luke Greenfield Jake Johnson, Damon Wayans Jr., Rob Riggle, Ni... 2014 104 6.5 112729 82.39 30.0
Max 985 Adventure,Family A Malinois dog that helped American Marines in... Boaz Yakin Thomas Haden Church, Josh Wiggins, Luke Kleint... 2015 111 6.8 21405 42.65 47.0
Your Highness 986 Adventure,Comedy,Fantasy When Prince Fabious's bride is kidnapped, he g... David Gordon Green Danny McBride, Natalie Portman, James Franco, ... 2011 102 5.6 87904 21.56 31.0
Final Destination 5 987 Horror,Thriller Survivors of a suspension-bridge collapse lear... Steven Quale Nicholas D'Agosto, Emma Bell, Arlen Escarpeta,... 2011 92 5.9 88000 42.58 50.0
Endless Love 988 Drama,Romance The story of a privileged girl and a charismat... Shana Feste Gabriella Wilde, Alex Pettyfer, Bruce Greenwoo... 2014 104 6.3 33688 23.39 30.0
Underworld: Rise of the Lycans 991 Action,Adventure,Fantasy An origins story centered on the centuries-old... Patrick Tatopoulos Rhona Mitra, Michael Sheen, Bill Nighy, Steven... 2009 92 6.6 129708 45.80 44.0
Taare Zameen Par 992 Drama,Family,Music An eight-year-old boy is thought to be a lazy ... Aamir Khan Darsheel Safary, Aamir Khan, Tanay Chheda, Sac... 2007 165 8.5 102697 1.20 42.0
Resident Evil: Afterlife 994 Action,Adventure,Horror While still out to destroy the evil Umbrella C... Paul W.S. Anderson Milla Jovovich, Ali Larter, Wentworth Miller,K... 2010 97 5.9 140900 60.13 37.0
Project X 995 Comedy 3 high school seniors throw a birthday party t... Nima Nourizadeh Thomas Mann, Oliver Cooper, Jonathan Daniel Br... 2012 88 6.7 164088 54.72 48.0
Hostel: Part II 997 Horror Three American college students studying abroa... Eli Roth Lauren German, Heather Matarazzo, Bijou Philli... 2007 94 5.5 73152 17.54 46.0
Step Up 2: The Streets 998 Drama,Music,Romance Romantic sparks occur between two dance studen... Jon M. Chu Robert Hoffman, Briana Evigan, Cassie Ventura,... 2008 98 6.2 70699 58.01 50.0
Nine Lives 1000 Comedy,Family,Fantasy A stuffy businessman finds himself trapped ins... Barry Sonnenfeld Kevin Spacey, Jennifer Garner, Robbie Amell,Ch... 2016 87 5.3 12435 19.64 11.0

838 rows × 11 columns

Esta operación elminará toda fila que tenga al menos un valor null, pero devolverá un DataFrame sin alterar el original. Puede especificarse inplace=True si se quiere modificar los datos originales.

En este caso, se eliminaron 1280 filas donde revenue_millions es null y 64 filas donde metascore es null. Esto suele ser inconveniente pues existen datos valiosos en otras columnas de las filas eliminadas.

Además de eliminar filas, se pueden eliminar las columnas que contienen valores null, estableciendo axis=1:

In [24]:
movies_df.dropna(axis=1)
Out[24]:
rank genre description director actors year runtime rating votes
Title
Guardians of the Galaxy 1 Action,Adventure,Sci-Fi A group of intergalactic criminals are forced ... James Gunn Chris Pratt, Vin Diesel, Bradley Cooper, Zoe S... 2014 121 8.1 757074
Prometheus 2 Adventure,Mystery,Sci-Fi Following clues to the origin of mankind, a te... Ridley Scott Noomi Rapace, Logan Marshall-Green, Michael Fa... 2012 124 7.0 485820
Split 3 Horror,Thriller Three girls are kidnapped by a man with a diag... M. Night Shyamalan James McAvoy, Anya Taylor-Joy, Haley Lu Richar... 2016 117 7.3 157606
Sing 4 Animation,Comedy,Family In a city of humanoid animals, a hustling thea... Christophe Lourdelet Matthew McConaughey,Reese Witherspoon, Seth Ma... 2016 108 7.2 60545
Suicide Squad 5 Action,Adventure,Fantasy A secret government agency recruits some of th... David Ayer Will Smith, Jared Leto, Margot Robbie, Viola D... 2016 123 6.2 393727
The Great Wall 6 Action,Adventure,Fantasy European mercenaries searching for black powde... Yimou Zhang Matt Damon, Tian Jing, Willem Dafoe, Andy Lau 2016 103 6.1 56036
La La Land 7 Comedy,Drama,Music A jazz pianist falls for an aspiring actress i... Damien Chazelle Ryan Gosling, Emma Stone, Rosemarie DeWitt, J.... 2016 128 8.3 258682
Mindhorn 8 Comedy A has-been actor best known for playing the ti... Sean Foley Essie Davis, Andrea Riseborough, Julian Barrat... 2016 89 6.4 2490
The Lost City of Z 9 Action,Adventure,Biography A true-life drama, centering on British explor... James Gray Charlie Hunnam, Robert Pattinson, Sienna Mille... 2016 141 7.1 7188
Passengers 10 Adventure,Drama,Romance A spacecraft traveling to a distant colony pla... Morten Tyldum Jennifer Lawrence, Chris Pratt, Michael Sheen,... 2016 116 7.0 192177
Fantastic Beasts and Where to Find Them 11 Adventure,Family,Fantasy The adventures of writer Newt Scamander in New... David Yates Eddie Redmayne, Katherine Waterston, Alison Su... 2016 133 7.5 232072
Hidden Figures 12 Biography,Drama,History The story of a team of female African-American... Theodore Melfi Taraji P. Henson, Octavia Spencer, Janelle Mon... 2016 127 7.8 93103
Rogue One 13 Action,Adventure,Sci-Fi The Rebel Alliance makes a risky move to steal... Gareth Edwards Felicity Jones, Diego Luna, Alan Tudyk, Donnie... 2016 133 7.9 323118
Moana 14 Animation,Adventure,Comedy In Ancient Polynesia, when a terrible curse in... Ron Clements Auli'i Cravalho, Dwayne Johnson, Rachel House,... 2016 107 7.7 118151
Colossal 15 Action,Comedy,Drama Gloria is an out-of-work party girl forced to ... Nacho Vigalondo Anne Hathaway, Jason Sudeikis, Austin Stowell,... 2016 109 6.4 8612
The Secret Life of Pets 16 Animation,Adventure,Comedy The quiet life of a terrier named Max is upend... Chris Renaud Louis C.K., Eric Stonestreet, Kevin Hart, Lake... 2016 87 6.6 120259
Hacksaw Ridge 17 Biography,Drama,History WWII American Army Medic Desmond T. Doss, who ... Mel Gibson Andrew Garfield, Sam Worthington, Luke Bracey,... 2016 139 8.2 211760
Jason Bourne 18 Action,Thriller The CIA's most dangerous former operative is d... Paul Greengrass Matt Damon, Tommy Lee Jones, Alicia Vikander,V... 2016 123 6.7 150823
Lion 19 Biography,Drama A five-year-old Indian boy gets lost on the st... Garth Davis Dev Patel, Nicole Kidman, Rooney Mara, Sunny P... 2016 118 8.1 102061
Arrival 20 Drama,Mystery,Sci-Fi When twelve mysterious spacecraft appear aroun... Denis Villeneuve Amy Adams, Jeremy Renner, Forest Whitaker,Mich... 2016 116 8.0 340798
Gold 21 Adventure,Drama,Thriller Kenny Wells, a prospector desperate for a luck... Stephen Gaghan Matthew McConaughey, Edgar Ramírez, Bryce Dall... 2016 120 6.7 19053
Manchester by the Sea 22 Drama A depressed uncle is asked to take care of his... Kenneth Lonergan Casey Affleck, Michelle Williams, Kyle Chandle... 2016 137 7.9 134213
Hounds of Love 23 Crime,Drama,Horror A cold-blooded predatory couple while cruising... Ben Young Emma Booth, Ashleigh Cummings, Stephen Curry,S... 2016 108 6.7 1115
Trolls 24 Animation,Adventure,Comedy After the Bergens invade Troll Village, Poppy,... Walt Dohrn Anna Kendrick, Justin Timberlake,Zooey Deschan... 2016 92 6.5 38552
Independence Day: Resurgence 25 Action,Adventure,Sci-Fi Two decades after the first Independence Day i... Roland Emmerich Liam Hemsworth, Jeff Goldblum, Bill Pullman,Ma... 2016 120 5.3 127553
Paris pieds nus 26 Comedy Fiona visits Paris for the first time to assis... Dominique Abel Fiona Gordon, Dominique Abel,Emmanuelle Riva, ... 2016 83 6.8 222
Bahubali: The Beginning 27 Action,Adventure,Drama In ancient India, an adventurous and daring ma... S.S. Rajamouli Prabhas, Rana Daggubati, Anushka Shetty,Tamann... 2015 159 8.3 76193
Dead Awake 28 Horror,Thriller A young woman must save herself and her friend... Phillip Guzman Jocelin Donahue, Jesse Bradford, Jesse Borrego... 2016 99 4.7 523
Bad Moms 29 Comedy When three overworked and under-appreciated mo... Jon Lucas Mila Kunis, Kathryn Hahn, Kristen Bell,Christi... 2016 100 6.2 66540
Assassin's Creed 30 Action,Adventure,Drama When Callum Lynch explores the memories of his... Justin Kurzel Michael Fassbender, Marion Cotillard, Jeremy I... 2016 115 5.9 112813
... ... ... ... ... ... ... ... ... ...
Texas Chainsaw 3D 971 Horror,Thriller A young woman travels to Texas to collect an i... John Luessenhop Alexandra Daddario, Tania Raymonde, Scott East... 2013 92 4.8 37060
Disturbia 972 Drama,Mystery,Thriller A teen living under house arrest becomes convi... D.J. Caruso Shia LaBeouf, David Morse, Carrie-Anne Moss, S... 2007 105 6.9 193491
Rock of Ages 973 Comedy,Drama,Musical A small town girl and a city boy meet on the S... Adam Shankman Julianne Hough, Diego Boneta, Tom Cruise, Alec... 2012 123 5.9 64513
Scream 4 974 Horror,Mystery Ten years have passed, and Sidney Prescott, wh... Wes Craven Neve Campbell, Courteney Cox, David Arquette, ... 2011 111 6.2 108544
Queen of Katwe 975 Biography,Drama,Sport A Ugandan girl sees her world rapidly change a... Mira Nair Madina Nalwanga, David Oyelowo, Lupita Nyong'o... 2016 124 7.4 6753
My Big Fat Greek Wedding 2 976 Comedy,Family,Romance A Portokalos family secret brings the beloved ... Kirk Jones Nia Vardalos, John Corbett, Michael Constantin... 2016 94 6.0 20966
Dark Places 977 Drama,Mystery,Thriller Libby Day was only eight years old when her fa... Gilles Paquet-Brenner Charlize Theron, Nicholas Hoult, Christina Hen... 2015 113 6.2 31634
Amateur Night 978 Comedy Guy Carter is an award-winning graduate studen... Lisa Addario Jason Biggs, Janet Montgomery,Ashley Tisdale, ... 2016 92 5.0 2229
It's Only the End of the World 979 Drama Louis (Gaspard Ulliel), a terminally ill write... Xavier Dolan Nathalie Baye, Vincent Cassel, Marion Cotillar... 2016 97 7.0 10658
The Skin I Live In 980 Drama,Thriller A brilliant plastic surgeon, haunted by past t... Pedro Almodóvar Antonio Banderas, Elena Anaya, Jan Cornet,Mari... 2011 120 7.6 108772
Miracles from Heaven 981 Biography,Drama,Family A young girl suffering from a rare digestive d... Patricia Riggen Jennifer Garner, Kylie Rogers, Martin Henderso... 2016 109 7.0 12048
Annie 982 Comedy,Drama,Family A foster kid, who lives with her mean foster m... Will Gluck Quvenzhané Wallis, Cameron Diaz, Jamie Foxx, R... 2014 118 5.3 27312
Across the Universe 983 Drama,Fantasy,Musical The music of the Beatles and the Vietnam War f... Julie Taymor Evan Rachel Wood, Jim Sturgess, Joe Anderson, ... 2007 133 7.4 95172
Let's Be Cops 984 Comedy Two struggling pals dress as police officers f... Luke Greenfield Jake Johnson, Damon Wayans Jr., Rob Riggle, Ni... 2014 104 6.5 112729
Max 985 Adventure,Family A Malinois dog that helped American Marines in... Boaz Yakin Thomas Haden Church, Josh Wiggins, Luke Kleint... 2015 111 6.8 21405
Your Highness 986 Adventure,Comedy,Fantasy When Prince Fabious's bride is kidnapped, he g... David Gordon Green Danny McBride, Natalie Portman, James Franco, ... 2011 102 5.6 87904
Final Destination 5 987 Horror,Thriller Survivors of a suspension-bridge collapse lear... Steven Quale Nicholas D'Agosto, Emma Bell, Arlen Escarpeta,... 2011 92 5.9 88000
Endless Love 988 Drama,Romance The story of a privileged girl and a charismat... Shana Feste Gabriella Wilde, Alex Pettyfer, Bruce Greenwoo... 2014 104 6.3 33688
Martyrs 989 Horror A young woman's quest for revenge against the ... Pascal Laugier Morjana Alaoui, Mylène Jampanoï, Catherine Bég... 2008 99 7.1 63785
Selma 990 Biography,Drama,History A chronicle of Martin Luther King's campaign t... Ava DuVernay David Oyelowo, Carmen Ejogo, Tim Roth, Lorrain... 2014 128 7.5 67637
Underworld: Rise of the Lycans 991 Action,Adventure,Fantasy An origins story centered on the centuries-old... Patrick Tatopoulos Rhona Mitra, Michael Sheen, Bill Nighy, Steven... 2009 92 6.6 129708
Taare Zameen Par 992 Drama,Family,Music An eight-year-old boy is thought to be a lazy ... Aamir Khan Darsheel Safary, Aamir Khan, Tanay Chheda, Sac... 2007 165 8.5 102697
Take Me Home Tonight 993 Comedy,Drama,Romance Four years after graduation, an awkward high s... Michael Dowse Topher Grace, Anna Faris, Dan Fogler, Teresa P... 2011 97 6.3 45419
Resident Evil: Afterlife 994 Action,Adventure,Horror While still out to destroy the evil Umbrella C... Paul W.S. Anderson Milla Jovovich, Ali Larter, Wentworth Miller,K... 2010 97 5.9 140900
Project X 995 Comedy 3 high school seniors throw a birthday party t... Nima Nourizadeh Thomas Mann, Oliver Cooper, Jonathan Daniel Br... 2012 88 6.7 164088
Secret in Their Eyes 996 Crime,Drama,Mystery A tight-knit team of rising investigators, alo... Billy Ray Chiwetel Ejiofor, Nicole Kidman, Julia Roberts... 2015 111 6.2 27585
Hostel: Part II 997 Horror Three American college students studying abroa... Eli Roth Lauren German, Heather Matarazzo, Bijou Philli... 2007 94 5.5 73152
Step Up 2: The Streets 998 Drama,Music,Romance Romantic sparks occur between two dance studen... Jon M. Chu Robert Hoffman, Briana Evigan, Cassie Ventura,... 2008 98 6.2 70699
Search Party 999 Adventure,Comedy A pair of friends embark on a mission to reuni... Scot Armstrong Adam Pally, T.J. Miller, Thomas Middleditch,Sh... 2014 93 5.6 4881
Nine Lives 1000 Comedy,Family,Fantasy A stuffy businessman finds himself trapped ins... Barry Sonnenfeld Kevin Spacey, Jennifer Garner, Robbie Amell,Ch... 2016 87 5.3 12435

1000 rows × 9 columns

En nuestro conjunto de datos se eliminaron de esta forma las columnas revenue_millions y metascore.

Imputación

Imputación es una técnica utilizada para mantener los datos valiosos que tienen algunos valores null. Puede haber oportunidades en que eliminar toda una fila o columna que tiene un valor null borra una gran cantidad de datos del DataFrame, por lo tanto es posible imputar el valor null con otro valor, usualmente la media o la mediana de la columna en cuestión.

Veamos cómo imputar los valores perdidos de la columna revenue_millions. Primero extraemos esa columna en una variable:

In [25]:
ingresos = movies_df['revenue_millions']

El uso de corchetes es la forma usual de seleccionar columnas en un DataFrame.

Ahora, retorno contiene una Series:

In [26]:
ingresos.head()
Out[26]:
Title
Guardians of the Galaxy    333.13
Prometheus                 126.46
Split                      138.12
Sing                       270.32
Suicide Squad              325.02
Name: revenue_millions, dtype: float64

El formato es un poco diferente al de un DataFrame, pero se mantiene el índice con Title.

Vamos a imputar los valores perdidos utilizando la media de la columna:

In [27]:
ingresos_media = ingresos.mean()
ingresos_media
Out[27]:
82.95637614678898

Con el valor obtenido, vamos a reemplazar los nulls utilizando .fillna():

In [28]:
ingresos.fillna(ingresos_media, inplace=True)

Ahora hemos reemplazado todos los nulls en retorno con la media de la columna. Notar que utilizando inplace=True hemos efectivamente modificado el movies_df original:

In [29]:
movies_df.isnull().sum()
Out[29]:
rank                 0
genre                0
description          0
director             0
actors               0
year                 0
runtime              0
rating               0
votes                0
revenue_millions     0
metascore           64
dtype: int64

Imputar una columna completa con el mismo valor puede no ser lo más conveniente. Una mejor idea es intentar una imputación más granular por Genre o Director.

Por ejemplo, podríamos encontrar la media del retorno generado en cada género individualmente e imputar los nulls en cada género con la media correspondiente.

Analizando las variables

Utilizando .describe() en un DataFrame podemos obtener un resumen de la distribución de las variables numéricas:

In [30]:
movies_df.describe()
Out[30]:
rank year runtime rating votes revenue_millions metascore
count 1000.000000 1000.000000 1000.000000 1000.000000 1.000000e+03 1000.000000 936.000000
mean 500.500000 2012.783000 113.172000 6.723200 1.698083e+05 82.956376 58.985043
std 288.819436 3.205962 18.810908 0.945429 1.887626e+05 96.412043 17.194757
min 1.000000 2006.000000 66.000000 1.900000 6.100000e+01 0.000000 11.000000
25% 250.750000 2010.000000 100.000000 6.200000 3.630900e+04 17.442500 47.000000
50% 500.500000 2014.000000 111.000000 6.800000 1.107990e+05 60.375000 59.500000
75% 750.250000 2016.000000 123.000000 7.400000 2.399098e+05 99.177500 72.000000
max 1000.000000 2016.000000 191.000000 9.000000 1.791916e+06 936.630000 100.000000

Comprender qué variables son numéricas ayuda a pensar la forma en que conviene representar gráficamente los datos.

.describe() también puede usarse con variables categóricas para obtener el conteo de filas, el conteo único de categorías, la categoría más utilizada y su frecuencia:

In [31]:
movies_df['genre'].describe()
Out[31]:
count                        1000
unique                        207
top       Action,Adventure,Sci-Fi
freq                           50
Name: genre, dtype: object

Esto nos dice que la columna genre tiene 207 valores únicos, la que más aparece es Action/Adventure/Sci-Fi, que aparece 50 veces (freq).

.value_counts() devuelve la frecuencia de todos los valores en una columna:

In [32]:
movies_df['genre'].value_counts().head(10)
Out[32]:
Action,Adventure,Sci-Fi       50
Drama                         48
Comedy,Drama,Romance          35
Comedy                        32
Drama,Romance                 31
Animation,Adventure,Comedy    27
Comedy,Drama                  27
Action,Adventure,Fantasy      27
Comedy,Romance                26
Crime,Drama,Thriller          24
Name: genre, dtype: int64

Relaciones entre variables numéricas

Utilizando el método de correlación .corr() podemos estimar la relación entre cada par de variables numéricas:

In [33]:
movies_df.corr()
Out[33]:
rank year runtime rating votes revenue_millions metascore
rank 1.000000 -0.261605 -0.221739 -0.219555 -0.283876 -0.252996 -0.191869
year -0.261605 1.000000 -0.164900 -0.211219 -0.411904 -0.117562 -0.079305
runtime -0.221739 -0.164900 1.000000 0.392214 0.407062 0.247834 0.211978
rating -0.219555 -0.211219 0.392214 1.000000 0.511537 0.189527 0.631897
votes -0.283876 -0.411904 0.407062 0.511537 1.000000 0.607941 0.325684
revenue_millions -0.252996 -0.117562 0.247834 0.189527 0.607941 1.000000 0.133328
metascore -0.191869 -0.079305 0.211978 0.631897 0.325684 0.133328 1.000000

Las tablas de correlación son una representación numérica de las relaciones bivariadas en el conjunto de datos.

Los números positivos indican una correlación positiva (si una variable crece, la otra también), y los negativos representan una correlación inversa (si una variable crece, la otra decrece). Un valor de 1.0 indica una correlación perfecta.

Entonces, observando la primer fila vemos que rank tiene una correlación perfecta con ella misma, lo que es obvio. Por otra parte, la correlación entre votes y revenue_millions es de 0.6, lo que resulta interesante.

Examinar relaciones bivariadas es útil cuando tenemos una variable dependiente en mente y queremos ver cuáles son los factores más correlacionados con el incremento o decremento de esa variable. Es posible representar gráficamente relaciones bivariadas con gráficos de puntos, como veremos más adelante).

Rebanado, selección y extracción

Es importante notar que, aunque muchos métodos de pandas son similares, las DataFrame y las Series tienen atributos diferentes, por lo que es necesario saber qué tipo de dato estamos manipulando para evitar errores.

Extracción por columna

Hemos visto que para extraer una columna se utilizan corchetes:

In [34]:
genero = movies_df['genre']
type(genero)
Out[34]:
pandas.core.series.Series

Esta operación devuelve un objeto de tipo Series. Para extraer una columna como un DataFrame es necesario pasar una lista de nombres de columnas (aunque sea una sola):

In [35]:
genero = movies_df[['genre']]
type(genero)
Out[35]:
pandas.core.frame.DataFrame

Dado que es solo una lista, es simple extraer más de una columna:

In [36]:
subset = movies_df[['genre', 'rating']]
subset.head()
Out[36]:
genre rating
Title
Guardians of the Galaxy Action,Adventure,Sci-Fi 8.1
Prometheus Adventure,Mystery,Sci-Fi 7.0
Split Horror,Thriller 7.3
Sing Animation,Comedy,Family 7.2
Suicide Squad Action,Adventure,Fantasy 6.2

Extracción por fila

Para extraer datos de una DataFrame por fila disponemos de dos opciones:

  • .loc: localiza por nombre.
  • .iloc: localiza por índice numérico.

Recordemos que aún tenemos nuestros datos indexados por el título de la película, por lo que podemos usar .loc para extraer los datos de un título:

In [37]:
prom = movies_df.loc['Prometheus']
prom
Out[37]:
rank                                                                2
genre                                        Adventure,Mystery,Sci-Fi
description         Following clues to the origin of mankind, a te...
director                                                 Ridley Scott
actors              Noomi Rapace, Logan Marshall-Green, Michael Fa...
year                                                             2012
runtime                                                           124
rating                                                              7
votes                                                          485820
revenue_millions                                               126.46
metascore                                                          65
Name: Prometheus, dtype: object

Por otro lado, podemos utilizar .iloc para obtener Prometheus por su índice numérico:

In [38]:
prom = movies_df.iloc[1]
prom
Out[38]:
rank                                                                2
genre                                        Adventure,Mystery,Sci-Fi
description         Following clues to the origin of mankind, a te...
director                                                 Ridley Scott
actors              Noomi Rapace, Logan Marshall-Green, Michael Fa...
year                                                             2012
runtime                                                           124
rating                                                              7
votes                                                          485820
revenue_millions                                               126.46
metascore                                                          65
Name: Prometheus, dtype: object

.loc e .iloc pueden pensarse como similares al rebanado de listas en Python, lo que nos permite seleccionar múltiples filas:

In [39]:
movie_subset = movies_df.loc['Prometheus':'Sing']
movie_subset = movies_df.iloc[1:4]
movie_subset
Out[39]:
rank genre description director actors year runtime rating votes revenue_millions metascore
Title
Prometheus 2 Adventure,Mystery,Sci-Fi Following clues to the origin of mankind, a te... Ridley Scott Noomi Rapace, Logan Marshall-Green, Michael Fa... 2012 124 7.0 485820 126.46 65.0
Split 3 Horror,Thriller Three girls are kidnapped by a man with a diag... M. Night Shyamalan James McAvoy, Anya Taylor-Joy, Haley Lu Richar... 2016 117 7.3 157606 138.12 62.0
Sing 4 Animation,Comedy,Family In a city of humanoid animals, a hustling thea... Christophe Lourdelet Matthew McConaughey,Reese Witherspoon, Seth Ma... 2016 108 7.2 60545 270.32 59.0

Una distinción importante entre .loc y .iloc al seleccionar múltiples filas es que .loc incluye la película Sing en el resultado, pero cuando utilizamos .iloc obtenemos las filas 1:4, pero la película con índice 4 (Suicide Squad) no está incluida.

El rebanado con .iloc sigue las mismas reglas que el rebanado de listas, el objeto al final del rango establecido no está incluido.

Selecciones condicionales

Hasta ahora hemos visto como seleccionar filas y columnas, pero us usual la necesidad de extraer información por medio de selecciones condicionales.

Por ejemplo, podríamos querer filtrar nuestras películas en el DataFrame para mostrar solo las dirigidas por Ridley Scott, o las que tienen un rating mayor o igual a 8.0.

Para esto, tomamos una columna del DataFrame y aplicamos una condición booleana sobre ella:

In [40]:
condition = (movies_df['director'] == 'Ridley Scott')
condition.head()
Out[40]:
Title
Guardians of the Galaxy    False
Prometheus                  True
Split                      False
Sing                       False
Suicide Squad              False
Name: director, dtype: bool

En forma similar a .isnull(), esta operación devuelve una Series con True o False: True para películas dirigidas por Ridley Scott y False para las que no fueron dirigidas por el.

Procedemos entonces a filtrar todas las películas no dirigidas por Ridley Scott. En otras palabras, no queremos las películas con False. Para devolver las filas con la condición True tenemos que pasar esta operación al DataFrame:

In [41]:
movies_df[movies_df['director'] == 'Ridley Scott']
Out[41]:
rank genre description director actors year runtime rating votes revenue_millions metascore
Title
Prometheus 2 Adventure,Mystery,Sci-Fi Following clues to the origin of mankind, a te... Ridley Scott Noomi Rapace, Logan Marshall-Green, Michael Fa... 2012 124 7.0 485820 126.46 65.0
The Martian 103 Adventure,Drama,Sci-Fi An astronaut becomes stranded on Mars after hi... Ridley Scott Matt Damon, Jessica Chastain, Kristen Wiig, Ka... 2015 144 8.0 556097 228.43 80.0
Robin Hood 388 Action,Adventure,Drama In 12th century England, Robin and his band of... Ridley Scott Russell Crowe, Cate Blanchett, Matthew Macfady... 2010 140 6.7 221117 105.22 53.0
American Gangster 471 Biography,Crime,Drama In 1970s America, a detective works to bring d... Ridley Scott Denzel Washington, Russell Crowe, Chiwetel Eji... 2007 157 7.8 337835 130.13 76.0
Exodus: Gods and Kings 517 Action,Adventure,Drama The defiant leader Moses rises up against the ... Ridley Scott Christian Bale, Joel Edgerton, Ben Kingsley, S... 2014 150 6.0 137299 65.01 52.0
The Counselor 522 Crime,Drama,Thriller A lawyer finds himself in over his head when h... Ridley Scott Michael Fassbender, Penélope Cruz, Cameron Dia... 2013 117 5.3 84927 16.97 48.0
A Good Year 531 Comedy,Drama,Romance A British investment broker inherits his uncle... Ridley Scott Russell Crowe, Abbie Cornish, Albert Finney, M... 2006 117 6.9 74674 7.46 47.0
Body of Lies 738 Action,Drama,Romance A CIA agent on the ground in Jordan hunts down... Ridley Scott Leonardo DiCaprio, Russell Crowe, Mark Strong,... 2008 128 7.1 182305 39.38 57.0

Podemos realizar selecciones condicionales utilizando valores numéricos filtrando el DataFrame por ratings:

In [42]:
movies_df[movies_df['rating'] >= 8.6].head(3)
Out[42]:
rank genre description director actors year runtime rating votes revenue_millions metascore
Title
Interstellar 37 Adventure,Drama,Sci-Fi A team of explorers travel through a wormhole ... Christopher Nolan Matthew McConaughey, Anne Hathaway, Jessica Ch... 2014 169 8.6 1047747 187.99 74.0
The Dark Knight 55 Action,Crime,Drama When the menace known as the Joker wreaks havo... Christopher Nolan Christian Bale, Heath Ledger, Aaron Eckhart,Mi... 2008 152 9.0 1791916 533.32 82.0
Inception 81 Action,Adventure,Sci-Fi A thief, who steals corporate secrets through ... Christopher Nolan Leonardo DiCaprio, Joseph Gordon-Levitt, Ellen... 2010 148 8.8 1583625 292.57 74.0

Podemos realizar selecciones condicionales más complejas por medio de operadores lógicos | para "or" y & para "and". Por ejemplo, podemos filtrar las películas dirigidas por Ridley Scott y con rating $\geq$ 7.0:

In [43]:
movies_df[(movies_df['director'] == 'Ridley Scott') & (movies_df['rating'] >= 7.0)]
Out[43]:
rank genre description director actors year runtime rating votes revenue_millions metascore
Title
Prometheus 2 Adventure,Mystery,Sci-Fi Following clues to the origin of mankind, a te... Ridley Scott Noomi Rapace, Logan Marshall-Green, Michael Fa... 2012 124 7.0 485820 126.46 65.0
The Martian 103 Adventure,Drama,Sci-Fi An astronaut becomes stranded on Mars after hi... Ridley Scott Matt Damon, Jessica Chastain, Kristen Wiig, Ka... 2015 144 8.0 556097 228.43 80.0
American Gangster 471 Biography,Crime,Drama In 1970s America, a detective works to bring d... Ridley Scott Denzel Washington, Russell Crowe, Chiwetel Eji... 2007 157 7.8 337835 130.13 76.0
Body of Lies 738 Action,Drama,Romance A CIA agent on the ground in Jordan hunts down... Ridley Scott Leonardo DiCaprio, Russell Crowe, Mark Strong,... 2008 128 7.1 182305 39.38 57.0

Es necesario asegurarse de agrupar las evaluaciones entre paréntesis de modo que Python sepa como evaluar la expresión condicional.

En algunos casos se pueden hacer selecciones más concisas utilizando métodos de listas. Por ejemplo, si queremos seleccionar películas dirigidas por Ridley Scott y Christopher Nolan, podemos hacerlo así:

In [44]:
movies_df[movies_df['director'].isin(['Christopher Nolan', 'Ridley Scott'])].head()
Out[44]:
rank genre description director actors year runtime rating votes revenue_millions metascore
Title
Prometheus 2 Adventure,Mystery,Sci-Fi Following clues to the origin of mankind, a te... Ridley Scott Noomi Rapace, Logan Marshall-Green, Michael Fa... 2012 124 7.0 485820 126.46 65.0
Interstellar 37 Adventure,Drama,Sci-Fi A team of explorers travel through a wormhole ... Christopher Nolan Matthew McConaughey, Anne Hathaway, Jessica Ch... 2014 169 8.6 1047747 187.99 74.0
The Dark Knight 55 Action,Crime,Drama When the menace known as the Joker wreaks havo... Christopher Nolan Christian Bale, Heath Ledger, Aaron Eckhart,Mi... 2008 152 9.0 1791916 533.32 82.0
The Prestige 65 Drama,Mystery,Sci-Fi Two stage magicians engage in competitive one-... Christopher Nolan Christian Bale, Hugh Jackman, Scarlett Johanss... 2006 130 8.5 913152 53.08 66.0
Inception 81 Action,Adventure,Sci-Fi A thief, who steals corporate secrets through ... Christopher Nolan Leonardo DiCaprio, Joseph Gordon-Levitt, Ellen... 2010 148 8.8 1583625 292.57 74.0

Supongamos que queremos seleccionar todas las películas estrenadas entre 2005 y 2010, que tienen un rating por encima de 8.0, pero que generaron por debajo del percentilo del 25% en ingresos:

In [45]:
movies_df[
    ((movies_df['year'] >= 2005) & (movies_df['year'] <= 2010))
    & (movies_df['rating'] > 8.0)
    & (movies_df['revenue_millions'] < movies_df['revenue_millions'].quantile(0.25))
]
Out[45]:
rank genre description director actors year runtime rating votes revenue_millions metascore
Title
3 Idiots 431 Comedy,Drama Two friends are searching for their long lost ... Rajkumar Hirani Aamir Khan, Madhavan, Mona Singh, Sharman Joshi 2009 170 8.4 238789 6.52 67.0
The Lives of Others 477 Drama,Thriller In 1984 East Berlin, an agent of the secret po... Florian Henckel von Donnersmarck Ulrich Mühe, Martina Gedeck,Sebastian Koch, Ul... 2006 137 8.5 278103 11.28 89.0
Incendies 714 Drama,Mystery,War Twins journey to the Middle East to discover t... Denis Villeneuve Lubna Azabal, Mélissa Désormeaux-Poulin, Maxim... 2010 131 8.2 92863 6.86 80.0
Taare Zameen Par 992 Drama,Family,Music An eight-year-old boy is thought to be a lazy ... Aamir Khan Darsheel Safary, Aamir Khan, Tanay Chheda, Sac... 2007 165 8.5 102697 1.20 42.0

Si recordamos cuando usamos el método .describe(), el percentilo 25 para los ingresos estaba en alrededor de 17.4, podemos acceder a este valor directamente utilizando el método .quantile() con un float de 0.25.

Agrupación y unión de datos

La agrupación puede utilizarse para construir grupos de filas sobre la base de una característica específica, por ejemplo, la variable categórica genre. Podemos entonces realizar diversas operaciones sobre tales agrupamientos como ayuda para describir los datos:

In [54]:
grupo_genero = movies_df.groupby(by=['genre'])
grupo_genero_media = grupo_genero.mean()
grupo_genero_media.head()
Out[54]:
rank year runtime rating votes revenue_millions metascore
genre
Action 352.500000 2016.000000 88.000000 6.150000 8618.500000 107.258188 37.000000
Action,Adventure 333.000000 2011.000000 124.333333 6.400000 334459.000000 223.740000 57.333333
Action,Adventure,Biography 284.000000 2015.500000 131.500000 7.000000 48780.000000 16.500000 62.500000
Action,Adventure,Comedy 407.142857 2014.214286 109.642857 6.592857 193502.357143 95.733571 47.214286
Action,Adventure,Crime 396.500000 2012.333333 116.500000 6.433333 200322.833333 90.620000 48.333333

Aplicación de funciones

In [ ]: