More

    Data Visualization: Python Pandas part 2

    Handling duplicates

    This dataset does not have duplicate rows, but it is always important to verify you aren’t aggregating duplicate rows.

    To demonstrate, let’s simply just double up our movies DataFrame by appending it to itself:

    In [ ]:

    temp_df = movies_df.append(movies_df) temp_df.shape

    Out[ ]:

    (2000, 11)

    Using append() will return a copy without affecting the original DataFrame. We are capturing this copy in temp so we aren’t working with the real data.

    Notice call .shape quickly proves our DataFrame rows have doubled.

    Now we can try dropping duplicates:

    In [ ]:

    temp_df = temp_df.drop_duplicates() temp_df.shape

    Out[ ]:

    (1000, 11)

    Just like append(), the drop_duplicates() method will also return a copy of your DataFrame, but this time with duplicates removed. Calling .shape confirms we’re back to the 1000 rows of our original dataset.

    It’s a little verbose to keep assigning DataFrames to the same variable like in this example. For this reason, pandas has the inplace keyword argument on many of its methods. Using inplace=True will modify the DataFrame object in place:

    In [ ]:

    temp_df.drop_duplicates(inplace=True) # inplace can be understand as the data is modified in place and the dataframe is updated.

    Now our temp_df will have the transformed data automatically.

    Another important argument for drop_duplicates() is keep, which has three possible options:

    • first: (default) Drop duplicates except for the first occurrence.
    • last: Drop duplicates except for the last occurrence.
    • False: Drop all duplicates.

    Since we didn’t define the keep arugment in the previous example it was defaulted to first. This means that if two rows are the same pandas will drop the second row and keep the first row. Using last has the opposite effect: the first row is dropped.

    keep, on the other hand, will drop all duplicates. If two rows are the same then both will be dropped. Watch what happens to temp_df:

    In [ ]:

    temp_df = movies_df.append(movies_df) # make a new copy temp_df.drop_duplicates(inplace=True, keep=False) temp_df.shape

    Out[ ]:

    (0, 11)

    Since all rows were duplicates, keep=False dropped them all resulting in zero rows being left over. If you’re wondering why you would want to do this, one reason is that it allows you to locate all duplicates in your dataset. When conditional selections are shown below you’ll see how to do that.

    Column cleanup

    Many times datasets will have verbose column names with symbols, upper and lowercase words, spaces, and typos. To make selecting data by column name easier we can spend a little time cleaning up their names.

    Here’s how to print the column names of our dataset:

    In [ ]:

    movies_df.columns

    Out[ ]:

    Index(['Rank', 'Genre', 'Description', 'Director', 'Actors', 'Year',
           'Runtime (Minutes)', 'Rating', 'Votes', 'Revenue (Millions)',
           'Metascore'],
          dtype='object')

    Not only does .columns come in handy if you want to rename columns by allowing for simple copy and paste, it’s also useful if you need to understand why you are receiving a Key Error when selecting data by column.

    We can use the .rename() method to rename certain or all columns via a dict. We don’t want parentheses, so let’s rename those:

    In [ ]:

    movies_df.rename(columns={ ‘Runtime (Minutes)’: ‘Runtime’, ‘Revenue (Millions)’: ‘Revenue_millions’ }, inplace=True) movies_df.columns

    Out[ ]:

    Index(['Rank', 'Genre', 'Description', 'Director', 'Actors', 'Year', 'Runtime',
           'Rating', 'Votes', 'Revenue_millions', 'Metascore'],
          dtype='object')

    Excellent. But what if we want to lowercase all names? Instead of using .rename() we could also set a list of names to the columns like so:

    In [ ]:

    movies_df.columns = [‘rank’, ‘genre’, ‘description’, ‘director’, ‘actors’, ‘year’, ‘runtime’, ‘rating’, ‘votes’, ‘revenue_millions’, ‘metascore’] movies_df.columns

    Out[ ]:

    Index(['rank', 'genre', 'description', 'director', 'actors', 'year', 'runtime',
           'rating', 'votes', 'revenue_millions', 'metascore'],
          dtype='object')

    But that’s too much work. Instead of just renaming each column manually we can do a list comprehension:

    In [ ]:

    movies_df.columns = [col.lower() for col in movies_df] movies_df.columns

    Out[ ]:

    Index(['rank', 'genre', 'description', 'director', 'actors', 'year', 'runtime',
           'rating', 'votes', 'revenue_millions', 'metascore'],
          dtype='object')

    list (and dict) comprehensions come in handy a lot when working with pandas and data in general.

    It’s a good idea to lowercase, remove special characters, and replace spaces with underscores if you’ll be working with a dataset for some time.

    How to work with missing values

    When exploring data, you’ll most likely encounter missing or null values, which are essentially placeholders for non-existent values. Most commonly you’ll see Python’s None or NumPy’s np.nan, each of which are handled differently in some situations.

    There are two options in dealing with nulls:

    1. Get rid of rows or columns with nulls
    2. Replace nulls with non-null values, a technique known as imputation

    Let’s calculate to total number of nulls in each column of our dataset. The first step is to check which cells in our DataFrame are null:

    In [ ]:

    movies_df.isnull()

    Out[ ]:

    rankgenredescriptiondirectoractorsyearruntimeratingvotesrevenue_millionsmetascore
    Title
    Guardians of the GalaxyFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
    PrometheusFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
    SplitFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
    SingFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
    Suicide SquadFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
    Secret in Their EyesFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
    Hostel: Part IIFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
    Step Up 2: The StreetsFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
    Search PartyFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
    Nine LivesFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse

    1000 rows × 11 columns

    Notice isnull() returns a DataFrame where each cell is either True or False depending on that cell’s null status.

    To count the number of nulls in each column we use an aggregate function for summing:

    In [ ]:

    movies_df.isnull().sum()

    Out[ ]:

    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() just by iteself isn’t very useful, and is usually used in conjunction with other methods, like sum().

    We can see now that our data has 128 missing values for revenue_millions and 64 missing values for metascore.

    Removing null values

    Data Scientists and Analysts regularly face the dilemma of dropping or imputing null values, and is a decision that requires intimate knowledge of your data and its context. Overall, removing null data is only suggested if you have a small amount of missing data.

    Remove nulls is pretty simple:

    In [ ]:

    movies_df.dropna()

    Out[ ]:

    rankgenredescriptiondirectoractorsyearruntimeratingvotesrevenue_millionsmetascore
    Title
    Guardians of the Galaxy1Action,Adventure,Sci-FiA group of intergalactic criminals are forced …James GunnChris Pratt, Vin Diesel, Bradley Cooper, Zoe S…20141218.1757074333.1376.0
    Prometheus2Adventure,Mystery,Sci-FiFollowing clues to the origin of mankind, a te…Ridley ScottNoomi Rapace, Logan Marshall-Green, Michael Fa…20121247.0485820126.4665.0
    Split3Horror,ThrillerThree girls are kidnapped by a man with a diag…M. Night ShyamalanJames McAvoy, Anya Taylor-Joy, Haley Lu Richar…20161177.3157606138.1262.0
    Sing4Animation,Comedy,FamilyIn a city of humanoid animals, a hustling thea…Christophe LourdeletMatthew McConaughey,Reese Witherspoon, Seth Ma…20161087.260545270.3259.0
    Suicide Squad5Action,Adventure,FantasyA secret government agency recruits some of th…David AyerWill Smith, Jared Leto, Margot Robbie, Viola D…20161236.2393727325.0240.0
    Resident Evil: Afterlife994Action,Adventure,HorrorWhile still out to destroy the evil Umbrella C…Paul W.S. AndersonMilla Jovovich, Ali Larter, Wentworth Miller,K…2010975.914090060.1337.0
    Project X995Comedy3 high school seniors throw a birthday party t…Nima NourizadehThomas Mann, Oliver Cooper, Jonathan Daniel Br…2012886.716408854.7248.0
    Hostel: Part II997HorrorThree American college students studying abroa…Eli RothLauren German, Heather Matarazzo, Bijou Philli…2007945.57315217.5446.0
    Step Up 2: The Streets998Drama,Music,RomanceRomantic sparks occur between two dance studen…Jon M. ChuRobert Hoffman, Briana Evigan, Cassie Ventura,…2008986.27069958.0150.0
    Nine Lives1000Comedy,Family,FantasyA stuffy businessman finds himself trapped ins…Barry SonnenfeldKevin Spacey, Jennifer Garner, Robbie Amell,Ch…2016875.31243519.6411.0

    838 rows × 11 columns

    This operation will delete any row with at least a single null value, but it will return a new DataFrame without altering the original one. You could specify inplace=True in this method as well.

    So in the case of our dataset, this operation would remove 128 rows where revenue_millions is null and 64 rows where metascore is null. This obviously seems like a waste since there’s perfectly good data in the other columns of those dropped rows. That’s why we’ll look at imputation next.

    Other than just dropping rows, you can also drop columns with null values by setting axis=1:

    In [ ]:

    movies_df.dropna(axis=1)

    Out[ ]:

    rankgenredescriptiondirectoractorsyearruntimeratingvotes
    Title
    Guardians of the Galaxy1Action,Adventure,Sci-FiA group of intergalactic criminals are forced …James GunnChris Pratt, Vin Diesel, Bradley Cooper, Zoe S…20141218.1757074
    Prometheus2Adventure,Mystery,Sci-FiFollowing clues to the origin of mankind, a te…Ridley ScottNoomi Rapace, Logan Marshall-Green, Michael Fa…20121247.0485820
    Split3Horror,ThrillerThree girls are kidnapped by a man with a diag…M. Night ShyamalanJames McAvoy, Anya Taylor-Joy, Haley Lu Richar…20161177.3157606
    Sing4Animation,Comedy,FamilyIn a city of humanoid animals, a hustling thea…Christophe LourdeletMatthew McConaughey,Reese Witherspoon, Seth Ma…20161087.260545
    Suicide Squad5Action,Adventure,FantasyA secret government agency recruits some of th…David AyerWill Smith, Jared Leto, Margot Robbie, Viola D…20161236.2393727
    Secret in Their Eyes996Crime,Drama,MysteryA tight-knit team of rising investigators, alo…Billy RayChiwetel Ejiofor, Nicole Kidman, Julia Roberts…20151116.227585
    Hostel: Part II997HorrorThree American college students studying abroa…Eli RothLauren German, Heather Matarazzo, Bijou Philli…2007945.573152
    Step Up 2: The Streets998Drama,Music,RomanceRomantic sparks occur between two dance studen…Jon M. ChuRobert Hoffman, Briana Evigan, Cassie Ventura,…2008986.270699
    Search Party999Adventure,ComedyA pair of friends embark on a mission to reuni…Scot ArmstrongAdam Pally, T.J. Miller, Thomas Middleditch,Sh…2014935.64881
    Nine Lives1000Comedy,Family,FantasyA stuffy businessman finds himself trapped ins…Barry SonnenfeldKevin Spacey, Jennifer Garner, Robbie Amell,Ch…2016875.312435

    1000 rows × 9 columns

    In our dataset, this operation would drop the revenue_millions and metascore columns.

    Intuition side note: What’s with this axis=1 parameter?

    It’s not immediately obvious where axis comes from and why you need it to be 1 for it to affect columns. To see why, just look at the .shape output:

    In [ ]:

    movies_df.shape

    Out[ ]:

    (1000, 11)

    As we learned above, this is a tuple that represents the shape of the DataFrame, i.e. 1000 rows and 11 columns. Note that the rows are at index zero of this tuple and columns are at index one of this tuple. This is why axis=1 affects columns. This comes from NumPy, and is a great example of why learning NumPy is worth your time.

    Imputation

    Imputation is a conventional feature engineering technique used to keep valuable data that have null values.

    There may be instances where dropping every row with a null value removes too big a chunk from your dataset, so instead we can impute that null with another value, usually the mean or the median of that column.

    Let’s look at imputing the missing values in the revenue_millions column. First we’ll extract that column into its own variable:

    In [ ]:

    revenue = movies_df[‘revenue_millions’]

    Using square brackets is the general way we select columns in a DataFrame.

    If you remember back to when we created DataFrames from scratch, the keys of the dict ended up as column names. Now when we select columns of a DataFrame, we use brackets just like if we were accessing a Python dictionary.

    revenue now contains a Series:

    In [ ]:

    revenue.head()

    Out[ ]:

    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

    Slightly different formatting than a DataFrame, but we still have our Title index.

    We’ll impute the missing values of revenue using the mean. Here’s the mean value:

    In [ ]:

    revenue_mean = revenue.mean() revenue_mean

    Out[ ]:

    82.95637614678897

    With the mean, let’s fill the nulls using fillna():

    In [ ]:

    revenue.fillna(revenue_mean, inplace=True)

    We have now replaced all nulls in revenue with the mean of the column. Notice that by using inplace=True we have actually affected the original movies_df:

    In [ ]:

    movies_df.isnull().sum()

    Out[ ]:

    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

    Imputing an entire column with the same value like this is a basic example. It would be a better idea to try a more granular imputation by Genre or Director.

    For example, you would find the mean of the revenue generated in each genre individually and impute the nulls in each genre with that genre’s mean.

    Let’s now look at more ways to examine and understand the dataset.

    Understanding your variables

    Using describe() on an entire DataFrame we can get a summary of the distribution of continuous variables:

    In [ ]:

    movies_df.describe()

    Out[ ]:

    rankyearruntimeratingvotesrevenue_millionsmetascore
    count1000.0000001000.0000001000.0000001000.0000001.000000e+031000.000000936.000000
    mean500.5000002012.783000113.1720006.7232001.698083e+0582.95637658.985043
    std288.8194363.20596218.8109080.9454291.887626e+0596.41204317.194757
    min1.0000002006.00000066.0000001.9000006.100000e+010.00000011.000000
    25%250.7500002010.000000100.0000006.2000003.630900e+0417.44250047.000000
    50%500.5000002014.000000111.0000006.8000001.107990e+0560.37500059.500000
    75%750.2500002016.000000123.0000007.4000002.399098e+0599.17750072.000000
    max1000.0000002016.000000191.0000009.0000001.791916e+06936.630000100.000000

    Understanding which numbers are continuous also comes in handy when thinking about the type of plot to use to represent your data visually.

    .describe() can also be used on a categorical variable to get the count of rows, unique count of categories, top category, and freq of top category:

    In [ ]:

    movies_df[‘genre’].describe()

    Out[ ]:

    count                        1000
    unique                        207
    top       Action,Adventure,Sci-Fi
    freq                           50
    Name: genre, dtype: object

    This tells us that the genre column has 207 unique values, the top value is Action/Adventure/Sci-Fi, which shows up 50 times (freq).

    .value_counts() can tell us the frequency of all values in a column:

    In [ ]:

    movies_df[‘genre’].value_counts().head(10)

    Out[ ]:

    Action,Adventure,Sci-Fi       50
    Drama                         48
    Comedy,Drama,Romance          35
    Comedy                        32
    Drama,Romance                 31
    Action,Adventure,Fantasy      27
    Comedy,Drama                  27
    Animation,Adventure,Comedy    27
    Comedy,Romance                26
    Crime,Drama,Thriller          24
    Name: genre, dtype: int64

    Relationships between continuous variables (This concept is optional to teach. One can start after 3 cells. Start from DataFrame slicing, selecting, extracting)

    By using the correlation method .corr() we can generate the relationship between each continuous variable:

    In [ ]:

    movies_df.corr()

    Out[ ]:

    rankyearruntimeratingvotesrevenue_millionsmetascore
    rank1.000000-0.261605-0.221739-0.219555-0.283876-0.252996-0.191869
    year-0.2616051.000000-0.164900-0.211219-0.411904-0.117562-0.079305
    runtime-0.221739-0.1649001.0000000.3922140.4070620.2478340.211978
    rating-0.219555-0.2112190.3922141.0000000.5115370.1895270.631897
    votes-0.283876-0.4119040.4070620.5115371.0000000.6079410.325684
    revenue_millions-0.252996-0.1175620.2478340.1895270.6079411.0000000.133328
    metascore-0.191869-0.0793050.2119780.6318970.3256840.1333281.000000

    Correlation tables are a numerical representation of the bivariate relationships in the dataset.

    Positive numbers indicate a positive correlation — one goes up the other goes up — and negative numbers represent an inverse correlation — one goes up the other goes down. 1.0 indicates a perfect correlation.

    So looking in the first row, first column we see rank has a perfect correlation with itself, which is obvious. On the other hand, the correlation between votes and revenue_millions is 0.6. A little more interesting.

    DataFrame slicing, selecting, extracting

    Up until now we’ve focused on some basic summaries of our data. We’ve learned about simple column extraction using single brackets, and we imputed null values in a column using fillna(). Below are the other methods of slicing, selecting, and extracting you’ll need to use constantly.

    It’s important to note that, although many methods are the same, DataFrames and Series have different attributes, so you’ll need be sure to know which type you are working with or else you will receive attribute errors.

    Let’s look at working with columns first.

    By column

    You already saw how to extract a column using square brackets like this:

    In [ ]:

    genre_col = movies_df[‘genre’] type(genre_col) genre_col

    Out[ ]:

    Title
    Guardians of the Galaxy     Action,Adventure,Sci-Fi
    Prometheus                 Adventure,Mystery,Sci-Fi
    Split                               Horror,Thriller
    Sing                        Animation,Comedy,Family
    Suicide Squad              Action,Adventure,Fantasy
                                         ...           
    Secret in Their Eyes            Crime,Drama,Mystery
    Hostel: Part II                              Horror
    Step Up 2: The Streets          Drama,Music,Romance
    Search Party                       Adventure,Comedy
    Nine Lives                    Comedy,Family,Fantasy
    Name: genre, Length: 1000, dtype: object

    This will return a Series. To extract a column as a DataFrame, you need to pass a list of column names. In our case that’s just a single column:

    In [ ]:

    genre_col = movies_df[[‘genre’]] type(genre_col)

    Out[ ]:

    pandas.core.frame.DataFrame

    Since it’s just a list, adding another column name is easy:

    In [ ]:

    subset = movies_df[[‘genre’, ‘rating’]] subset.head()

    Out[ ]:

    genrerating
    Title
    Guardians of the GalaxyAction,Adventure,Sci-Fi8.1
    PrometheusAdventure,Mystery,Sci-Fi7.0
    SplitHorror,Thriller7.3
    SingAnimation,Comedy,Family7.2
    Suicide SquadAction,Adventure,Fantasy6.2

    Now we’ll look at getting data by rows.

    By rows

    For rows, we have two options:

    • .loc – locates by name
    • .iloc– locates by numerical index

    Remember that we are still indexed by movie Title, so to use .loc we give it the Title of a movie:

    In [ ]:

    prom = movies_df.loc[“Prometheus”] prom

    Out[ ]:

    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

    On the other hand, with iloc we give it the numerical index of Prometheus:

    In [ ]:

    prom = movies_df.iloc[1] prom

    Out[ ]:

    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 and iloc can be thought of as similar to Python list slicing. To show this even further, let’s select multiple rows.

    How would you do it with a list? In Python, just slice with brackets like example_list[1:4]. It’s works the same way in pandas:

    In [ ]:

    movie_subset = movies_df.loc[‘Prometheus’:’Sing’] movie_subset = movies_df.iloc[1:4] movie_subset

    Out[ ]:

    rankgenredescriptiondirectoractorsyearruntimeratingvotesrevenue_millionsmetascore
    Title
    Prometheus2Adventure,Mystery,Sci-FiFollowing clues to the origin of mankind, a te…Ridley ScottNoomi Rapace, Logan Marshall-Green, Michael Fa…20121247.0485820126.4665.0
    Split3Horror,ThrillerThree girls are kidnapped by a man with a diag…M. Night ShyamalanJames McAvoy, Anya Taylor-Joy, Haley Lu Richar…20161177.3157606138.1262.0
    Sing4Animation,Comedy,FamilyIn a city of humanoid animals, a hustling thea…Christophe LourdeletMatthew McConaughey,Reese Witherspoon, Seth Ma…20161087.260545270.3259.0

    One important distinction between using .loc and .iloc to select multiple rows is that .loc includes the movie Sing in the result, but when using .iloc we’re getting rows 1:4 but the movie at index 4 (Suicide Squad) is not included.

    Slicing with .iloc follows the same rules as slicing with lists, the object at the index at the end is not included.

    Conditional selections

    We’ve gone over how to select columns and rows, but what if we want to make a conditional selection?

    For example, what if we want to filter our movies DataFrame to show only films directed by Ridley Scott or films with a rating greater than or equal to 8.0?

    To do that, we take a column from the DataFrame and apply a Boolean condition to it. Here’s an example of a Boolean condition:

    In [ ]:

    condition = (movies_df[‘director’] == “Ridley Scott”) condition.head()

    Out[ ]:

    Title
    Guardians of the Galaxy    False
    Prometheus                  True
    Split                      False
    Sing                       False
    Suicide Squad              False
    Name: director, dtype: bool

    Similar to isnull(), this returns a Series of True and False values: True for films directed by Ridley Scott and False for ones not directed by him.

    We want to filter out all movies not directed by Ridley Scott, in other words, we don’t want the False films. To return the rows where that condition is True we have to pass this operation into the DataFrame:

    In [ ]:

    movies_df[movies_df[‘director’] == “Ridley Scott”].head()

    Out[ ]:

    rankgenredescriptiondirectoractorsyearruntimeratingvotesrevenue_millionsmetascore
    Title
    Prometheus2Adventure,Mystery,Sci-FiFollowing clues to the origin of mankind, a te…Ridley ScottNoomi Rapace, Logan Marshall-Green, Michael Fa…20121247.0485820126.4665.0
    The Martian103Adventure,Drama,Sci-FiAn astronaut becomes stranded on Mars after hi…Ridley ScottMatt Damon, Jessica Chastain, Kristen Wiig, Ka…20151448.0556097228.4380.0
    Robin Hood388Action,Adventure,DramaIn 12th century England, Robin and his band of…Ridley ScottRussell Crowe, Cate Blanchett, Matthew Macfady…20101406.7221117105.2253.0
    American Gangster471Biography,Crime,DramaIn 1970s America, a detective works to bring d…Ridley ScottDenzel Washington, Russell Crowe, Chiwetel Eji…20071577.8337835130.1376.0
    Exodus: Gods and Kings517Action,Adventure,DramaThe defiant leader Moses rises up against the …Ridley ScottChristian Bale, Joel Edgerton, Ben Kingsley, S…20141506.013729965.0152.0

    You can get used to looking at these conditionals by reading it like:

    Select movies_df where movies_df director equals Ridley Scott

    Let’s look at conditional selections using numerical values by filtering the DataFrame by ratings:

    In [ ]:

    movies_df[movies_df[‘rating’] >= 8.6].head()

    Out[ ]:

    rankgenredescriptiondirectoractorsyearruntimeratingvotesrevenue_millionsmetascore
    Title
    Interstellar37Adventure,Drama,Sci-FiA team of explorers travel through a wormhole …Christopher NolanMatthew McConaughey, Anne Hathaway, Jessica Ch…20141698.61047747187.9974.0
    The Dark Knight55Action,Crime,DramaWhen the menace known as the Joker wreaks havo…Christopher NolanChristian Bale, Heath Ledger, Aaron Eckhart,Mi…20081529.01791916533.3282.0
    Inception81Action,Adventure,Sci-FiA thief, who steals corporate secrets through …Christopher NolanLeonardo DiCaprio, Joseph Gordon-Levitt, Ellen…20101488.81583625292.5774.0
    Kimi no na wa97Animation,Drama,FantasyTwo strangers find themselves linked in a biza…Makoto ShinkaiRyûnosuke Kamiki, Mone Kamishiraishi, Ryô Nari…20161068.6341104.6879.0
    Dangal118Action,Biography,DramaFormer wrestler Mahavir Singh Phogat and his t…Nitesh TiwariAamir Khan, Sakshi Tanwar, Fatima Sana Shaikh,…20161618.84896911.15NaN

    We can make some richer conditionals by using logical operators | for “or” and & for “and”.

    Let’s filter the the DataFrame to show only movies by Christopher Nolan OR Ridley Scott:

    In [ ]:

    movies_df[(movies_df[‘director’] == ‘Christopher Nolan’) | (movies_df[‘director’] == ‘Ridley Scott’)].head()

    Out[ ]:

    rankgenredescriptiondirectoractorsyearruntimeratingvotesrevenue_millionsmetascore
    Title
    Prometheus2Adventure,Mystery,Sci-FiFollowing clues to the origin of mankind, a te…Ridley ScottNoomi Rapace, Logan Marshall-Green, Michael Fa…20121247.0485820126.4665.0
    Interstellar37Adventure,Drama,Sci-FiA team of explorers travel through a wormhole …Christopher NolanMatthew McConaughey, Anne Hathaway, Jessica Ch…20141698.61047747187.9974.0
    The Dark Knight55Action,Crime,DramaWhen the menace known as the Joker wreaks havo…Christopher NolanChristian Bale, Heath Ledger, Aaron Eckhart,Mi…20081529.01791916533.3282.0
    The Prestige65Drama,Mystery,Sci-FiTwo stage magicians engage in competitive one-…Christopher NolanChristian Bale, Hugh Jackman, Scarlett Johanss…20061308.591315253.0866.0
    Inception81Action,Adventure,Sci-FiA thief, who steals corporate secrets through …Christopher NolanLeonardo DiCaprio, Joseph Gordon-Levitt, Ellen…20101488.81583625292.5774.0

    We need to make sure to group evaluations with parentheses so Python knows how to evaluate the conditional.

    Using the isin() method we could make this more concise though:

    In [ ]:

    movies_df[movies_df[‘director’].isin([‘Christopher Nolan’, ‘Ridley Scott’])].head()

    Out[ ]:

    rankgenredescriptiondirectoractorsyearruntimeratingvotesrevenue_millionsmetascore
    Title
    Prometheus2Adventure,Mystery,Sci-FiFollowing clues to the origin of mankind, a te…Ridley ScottNoomi Rapace, Logan Marshall-Green, Michael Fa…20121247.0485820126.4665.0
    Interstellar37Adventure,Drama,Sci-FiA team of explorers travel through a wormhole …Christopher NolanMatthew McConaughey, Anne Hathaway, Jessica Ch…20141698.61047747187.9974.0
    The Dark Knight55Action,Crime,DramaWhen the menace known as the Joker wreaks havo…Christopher NolanChristian Bale, Heath Ledger, Aaron Eckhart,Mi…20081529.01791916533.3282.0
    The Prestige65Drama,Mystery,Sci-FiTwo stage magicians engage in competitive one-…Christopher NolanChristian Bale, Hugh Jackman, Scarlett Johanss…20061308.591315253.0866.0
    Inception81Action,Adventure,Sci-FiA thief, who steals corporate secrets through …Christopher NolanLeonardo DiCaprio, Joseph Gordon-Levitt, Ellen…20101488.81583625292.5774.0

    Let’s say we want all movies that were released between 2005 and 2010, have a rating above 8.0

    Here’s how we could do all of that:

    In [ ]:

    movies_df[ ((movies_df[‘year’] >= 2005) & (movies_df[‘year’] <= 2010)) & (movies_df[‘rating’] > 8.0) ]

    Out[ ]:

    rankgenredescriptiondirectoractorsyearruntimeratingvotesrevenue_millionsmetascore
    Title
    The Dark Knight55Action,Crime,DramaWhen the menace known as the Joker wreaks havo…Christopher NolanChristian Bale, Heath Ledger, Aaron Eckhart,Mi…20081529.01791916533.32000082.0
    The Prestige65Drama,Mystery,Sci-FiTwo stage magicians engage in competitive one-…Christopher NolanChristian Bale, Hugh Jackman, Scarlett Johanss…20061308.591315253.08000066.0
    Inglourious Basterds78Adventure,Drama,WarIn Nazi-occupied France during World War II, a…Quentin TarantinoBrad Pitt, Diane Kruger, Eli Roth,Mélanie Laurent20091538.3959065120.52000069.0
    Inception81Action,Adventure,Sci-FiA thief, who steals corporate secrets through …Christopher NolanLeonardo DiCaprio, Joseph Gordon-Levitt, Ellen…20101488.81583625292.57000074.0
    The Departed100Crime,Drama,ThrillerAn undercover cop and a mole in the police att…Martin ScorseseLeonardo DiCaprio, Matt Damon, Jack Nicholson,…20061518.5937414132.37000085.0
    No Country for Old Men137Crime,Drama,ThrillerViolence and mayhem ensue after a hunter stumb…Ethan CoenTommy Lee Jones, Javier Bardem, Josh Brolin, W…20071228.166028674.27000091.0
    Shutter Island139Mystery,ThrillerIn 1954, a U.S. marshal investigates the disap…Martin ScorseseLeonardo DiCaprio, Emily Mortimer, Mark Ruffal…20101388.1855604127.97000063.0
    Into the Wild198Adventure,Biography,DramaAfter graduating from Emory University, top st…Sean PennEmile Hirsch, Vince Vaughn, Catherine Keener, …20071488.145930418.35000073.0
    Pan’s Labyrinth231Drama,Fantasy,WarIn the falangist Spain of 1944, the bookish yo…Guillermo del ToroIvana Baquero, Ariadna Gil, Sergi López,Maribe…20061188.249887937.62000098.0
    There Will Be Blood300Drama,HistoryA story of family, religion, hatred, oil and m…Paul Thomas AndersonDaniel Day-Lewis, Paul Dano, Ciarán Hinds,Mart…20071588.140068240.22000092.0
    The Bourne Ultimatum428Action,Mystery,ThrillerJason Bourne dodges a ruthless CIA official an…Paul GreengrassMatt Damon, Edgar Ramírez, Joan Allen, Julia S…20071158.1525700227.14000085.0
    3 Idiots431Comedy,DramaTwo friends are searching for their long lost …Rajkumar HiraniAamir Khan, Madhavan, Mona Singh, Sharman Joshi20091708.42387896.52000067.0
    The Lives of Others477Drama,ThrillerIn 1984 East Berlin, an agent of the secret po…Florian Henckel von DonnersmarckUlrich Mühe, Martina Gedeck,Sebastian Koch, Ul…20061378.527810311.28000089.0
    Up500Animation,Adventure,ComedySeventy-eight year old Carl Fredricksen travel…Pete DocterEdward Asner, Jordan Nagai, John Ratzenberger,…2009968.3722203292.98000088.0
    WALL·E635Animation,Adventure,FamilyIn the distant future, a small waste-collectin…Andrew StantonBen Burtt, Elissa Knight, Jeff Garlin, Fred Wi…2008988.4776897223.810000NaN
    Gran Torino646DramaDisgruntled Korean War veteran Walt Kowalski s…Clint EastwoodClint Eastwood, Bee Vang, Christopher Carley,A…20081168.2595779148.090000NaN
    Toy Story 3689Animation,Adventure,ComedyThe toys are mistakenly delivered to a day-car…Lee UnkrichTom Hanks, Tim Allen, Joan Cusack, Ned Beatty20101038.3586669414.98000092.0
    Hachi: A Dog’s Tale696Drama,FamilyA college professor’s bond with the abandoned …Lasse HallströmRichard Gere, Joan Allen, Cary-Hiroyuki Tagawa…2009938.117760282.95637661.0
    Incendies714Drama,Mystery,WarTwins journey to the Middle East to discover t…Denis VilleneuveLubna Azabal, Mélissa Désormeaux-Poulin, Maxim…20101318.2928636.86000080.0
    El secreto de sus ojos743Drama,Mystery,RomanceA retired legal counselor writes a novel hopin…Juan José CampanellaRicardo Darín, Soledad Villamil, Pablo Rago,Ca…20091298.214452420.17000080.0
    How to Train Your Dragon773Animation,Action,AdventureA hapless young Viking who aspires to hunt dra…Dean DeBloisJay Baruchel, Gerard Butler,Christopher Mintz-…2010988.1523893217.39000074.0
    Taare Zameen Par992Drama,Family,MusicAn eight-year-old boy is thought to be a lazy …Aamir KhanDarsheel Safary, Aamir Khan, Tanay Chheda, Sac…20071658.51026971.20000042.0

    If you recall up when we used .describe() the 25th percentile for revenue was about 17.4, and we can access this value directly by using the quantile() method with a float of 0.25.

    So here we have only four movies that match that criteria.

    Applying functions

    It is possible to iterate over a DataFrame or Series as you would with a list, but doing so — especially on large datasets — is very slow.

    An efficient alternative is to apply() a function to the dataset. For example, we could use a function to convert movies with an 8.0 or greater to a string value of “good” and the rest to “bad” and use this transformed values to create a new column.

    First we would create a function that, when given a rating, determines if it’s good or bad:

    In [ ]:

    defrating_function(x): if x >= 8.0: return”good”else: return”bad”

    Now we want to send the entire rating column through this function, which is what apply() does:

    In [ ]:

    movies_df[“rating_category”] = movies_df[“rating”].apply(rating_function) movies_df.head(2)

    Out[ ]:

    rankgenredescriptiondirectoractorsyearruntimeratingvotesrevenue_millionsmetascorerating_category
    Title
    Guardians of the Galaxy1Action,Adventure,Sci-FiA group of intergalactic criminals are forced …James GunnChris Pratt, Vin Diesel, Bradley Cooper, Zoe S…20141218.1757074333.1376.0good
    Prometheus2Adventure,Mystery,Sci-FiFollowing clues to the origin of mankind, a te…Ridley ScottNoomi Rapace, Logan Marshall-Green, Michael Fa…20121247.0485820126.4665.0bad

    The .apply() method passes every value in the rating column through the rating_function and then returns a new Series. This Series is then assigned to a new column called rating_category.

    Recent Articles

    Related Stories

    BÌNH LUẬN

    Vui lòng nhập bình luận của bạn
    Vui lòng nhập tên của bạn ở đây