October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsPC HealthRecommendedCrashes, freezes, slowdowns? Check your PC nowSpot repairable issues before they interrupt work.Check PCOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
World desk7 min

Building an Interactive Netflix Catalog Explorer with Streamlit and Plotly

Build a Streamlit and Plotly browser for a dated Netflix titles CSV, with conditional filters, interactive charts, and a table tied to the same filtered rows.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

You can build an interactive Netflix title catalog browser with Streamlit filters, a Plotly chart, and a results table—all driven by the same filtered DataFrame. The example below uses a CSV you supply; its snapshot date, publisher, and reuse terms must be stated in the app because popular Netflix-title files are historical third-party snapshots, not a live or official Netflix catalog.

Choose and identify the CSV before analyzing it

Netflix-title CSVs with similar names can describe different snapshots. For example, James Oruhu’s 2026 writeup describes an 8,807-record file as a late-2021 snapshot, while Onyx Data’s archived April 2021 challenge dataset reports 7,787 rows and 12 columns. These are descriptions of distinct third-party files, not counts of Netflix’s current catalog; they should not be combined or treated as a measured change in Netflix’s inventory. See Oruhu’s dataset writeup and Onyx Data’s April 2021 dataset description.

For this tutorial, use the April 2021 Onyx Data version, whose documented columns include title, type, country, date_added, release_year, rating, duration, listed_in, and description. Obtain the CSV from its publisher and check the terms attached to that exact download before using or redistributing it. The available dataset description does not establish a current reuse license, so do not assume the file can be republished or bundled with your app. In the code, set the snapshot label to match the actual file you obtained; do not use this example’s date if you selected a different version.

Set up a small Streamlit app

Install the Python packages in your environment, place the CSV at netflix_titles.csv beside the app, and save the following as app.py:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Sale
Roku Streaming Stick HD with Voice Remote
  • HD streaming made simple: With America’s number 1 TV streaming platform,* exploring popular apps—plus tons of free movies, shows, and live TV—is as easy as it is fun. *Based on hours streamed—Hypothesis Group
  • Compact without compromises: The sleek design of Roku Streaming Stick won’t block neighboring HDMI ports, and it even powers from your TV alone, plugging into the back and staying out of sight. No wall outlet, no extra cords, no clutter.
  • No more juggling remotes: Power up your TV, adjust the volume, and control your Roku device with one remote. Use your voice to quickly search, play entertainment, and more.
  • Shows on the go: Take your TV to-go when traveling—without needing to log into someone else’s device.
  • TV, simplified: With setup that only takes minutes, a simple-to-navigate Home Screen, and an uncluttered remote control that does all you need—Roku makes it easier to watch the TV you love.
import pandas as pd
import plotly.express as px
import streamlit as st

CSV_PATH = "netflix_titles.csv"
SOURCE_LABEL = "Onyx Data: Netflix Movies and TV Shows challenge dataset"
SNAPSHOT_LABEL = "April 2021"

st.set_page_config(page_title="Netflix Catalog Explorer", layout="wide")
st.title("Netflix Catalog Explorer")
st.caption(
    f"Source: {SOURCE_LABEL} · Snapshot: {SNAPSHOT_LABEL}. "
    "This is a historical third-party dataset, not a live Netflix catalog."
)

@st.cache_data
def load_data(path):
    df = pd.read_csv(path)
    # Normalize headings to simplify checks and references below.
    df.columns = [str(c).strip().lower() for c in df.columns]
    if "date_added" in df.columns:
        df["date_added"] = pd.to_datetime(df["date_added"], errors="coerce")
    if "release_year" in df.columns:
        df["release_year"] = pd.to_numeric(df["release_year"], errors="coerce")
    return df

df = load_data(CSV_PATH)

# Only offer filters for fields present in this particular CSV.
filtered = df.copy()
with st.sidebar:
    st.header("Filters")
    if "type" in filtered.columns:
        values = sorted(filtered["type"].dropna().astype(str).unique())
        chosen = st.multiselect("Content type", values, default=values)
        filtered = filtered[filtered["type"].astype(str).isin(chosen)]

    if "release_year" in filtered.columns:
        years = filtered["release_year"].dropna()
        if not years.empty:
            low, high = int(years.min()), int(years.max())
            year_range = st.slider("Release year", low, high, (low, high))
            filtered = filtered[
                filtered["release_year"].between(year_range[0], year_range[1])
            ]

    if "country" in filtered.columns:
        countries = sorted(
            {part.strip() for value in filtered["country"].dropna().astype(str)
             for part in value.split(",") if part.strip()}
        )
        chosen_countries = st.multiselect("Country (matches any listed value)", countries)
        if chosen_countries:
            pattern = "|".join(
                __import__("re").escape(value) for value in chosen_countries
            )
            filtered = filtered[
                filtered["country"].fillna("").str.contains(pattern, case=False, regex=True)
            ]

    if "rating" in filtered.columns:
        ratings = sorted(filtered["rating"].dropna().astype(str).unique())
        chosen_ratings = st.multiselect("Rating", ratings)
        if chosen_ratings:
            filtered = filtered[filtered["rating"].astype(str).isin(chosen_ratings)]

    if "listed_in" in filtered.columns:
        categories = sorted(
            {part.strip() for value in filtered["listed_in"].dropna().astype(str)
             for part in value.split(",") if part.strip()}
        )
        chosen_categories = st.multiselect("Category (matches any listed value)", categories)
        if chosen_categories:
            pattern = "|".join(
                __import__("re").escape(value) for value in chosen_categories
            )
            filtered = filtered[
                filtered["listed_in"].fillna("").str.contains(pattern, case=False, regex=True)
            ]

    query = st.text_input("Search title or description")
    if query:
        searchable = pd.Series(False, index=filtered.index)
        for column in ("title", "description"):
            if column in filtered.columns:
                searchable |= filtered[column].fillna("").astype(str).str.contains(
                    query, case=False, regex=False
                )
        filtered = filtered[searchable]

st.subheader(f"{len(filtered):,} matching rows")

if "type" in filtered.columns and not filtered.empty:
    mix = filtered["type"].fillna("Missing").value_counts().rename_axis("Type").reset_index(name="Titles")
    st.plotly_chart(
        px.bar(mix, x="Type", y="Titles", title="Movies and TV shows in the filtered results"),
        use_container_width=True,
    )

if "release_year" in filtered.columns and not filtered.empty:
    yearly = (
        filtered.dropna(subset=["release_year"])
        .groupby("release_year").size().rename("Titles").reset_index()
    )
    st.plotly_chart(
        px.histogram(
            yearly, x="release_year", y="Titles", histfunc="sum", nbins=30,
            title="Titles by release year in the filtered results",
            labels={"release_year": "Release year"},
        ),
        use_container_width=True,
    )

if "date_added" in filtered.columns and filtered["date_added"].notna().any():
    additions = (
        filtered.dropna(subset=["date_added"])
        .assign(added_year=lambda x: x["date_added"].dt.year)
        .groupby("added_year").size().rename("Titles").reset_index()
    )
    st.plotly_chart(
        px.bar(additions, x="added_year", y="Titles", title="Recorded additions by date_added year"),
        use_container_width=True,
    )

# Keep the table aligned with the filtered rows and show only available columns.
display_columns = [c for c in ["title", "type", "release_year", "country", "rating", "duration", "listed_in", "date_added"] if c in filtered.columns]
st.dataframe(filtered[display_columns] if display_columns else filtered, use_container_width=True, hide_index=True)

Run it from the directory containing both files with streamlit run app.py. The app caption names the chosen source and snapshot so that a reader does not mistake its results for a current availability listing. The April 2021 schema distinguishes date_added from release_year: the former records an addition date, when present, while the latter is the title’s release year. Parsing with errors set to coerce leaves unparseable or missing values as missing rather than inventing dates or years.

How do the filters and missing values work?

The sidebar filters are conditional: a control appears only when its column exists. Country and listed_in values are split on commas to populate options, and choosing one matches a row if that value occurs anywhere in its list. The chart and table count rows, not individual country or category memberships; a multi-country title therefore contributes one row to the overall count even though it can match more than one country selection.

Rank #2
Amazon Fire TV Stick 4K Plus with AI-powered Fire TV Search, Wi-Fi 6, stream hundreds of thousands of movies and shows, free & live TV, find shows faster with Alexa+
  • Advanced 4K streaming - Elevate your entertainment with the next generation of our best-selling 4K stick, with improved streaming performance optimized for 4K TVs.
  • The newest Fire TV experience (2026) – Our biggest update to Fire TV has a new, modern design that gets you to your entertainment fast. Browse dedicated content categories, pin more of your favorite apps, and get personalized recommendations from Alexa+. Spend less time scrolling, and more time watching.
  • Cloud gaming, no console required – Stream Call of Duty: Black Ops 7, Hogwarts Legacy, Outer Worlds 2, Ninja Gaiden 4, and hundreds of games on your Fire TV Stick 4K Select with Xbox Game Pass and Luna via cloud gaming. Xbox Game Pass subscription and compatible controller required. Each sold separately.
  • Smarter picks with Alexa+ – Getting to what you love has never been easier. Press the voice remote button and talk naturally to find what to watch across your apps, manage your smart home, or dive into virtually any topic.
  • Wi-Fi 6 support - Enjoy smooth 4K streaming, even when other devices are connected to your router.

Missing values are not offered as country, rating, or category options. The type chart labels a missing type as “Missing,” while release-year and addition-year charts omit rows without usable dates or years. This is important because a writeup of the separate late-2021 8,807-record file reports more than 4,300 missing entries. That figure applies to that file and writeup, not automatically to the April 2021 CSV or another download. Inspect missingness in the exact file you load before interpreting a chart.

Text search checks title and description independently when those columns exist. It is case-insensitive and treats the entered text literally rather than as a regular expression. All filters are applied to one DataFrame, so the displayed matching-row count, charts, and table are based on the same subset.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Sale
Roku Streaming Stick Plus with Voice Remote - 4K & HDR10+
  • 4K streaming made simple:With America’s number 1 TV streaming platform,* exploring popular apps—plus tons of free movies, shows, and live TV—is as easy as it is fun. *Based on hours streamed—Hypothesis Group
  • 4K picture quality: With Roku Streaming Stick Plus, watch your favorites with brilliant 4K picture and vivid HDR color.
  • Compact without compromises: Our sleek design won’t block neighboring HDMI ports, and it even powers from your TV alone, plugging into the back and staying out of sight. No wall outlet, no extra cords, no clutter.
  • No more juggling remotes: Power up your TV, adjust the volume, and control your Roku device with one remote. Use your voice to quickly search, play entertainment, and more.
  • Shows on the go: Take your TV to-go when traveling—without needing to log into someone else’s device.

Choose Plotly charts for the questions in the data

The example uses bars for content-type mix and recorded additions, and a binned distribution for release years. Plotly.py supports interactive charts across forms including bars, histograms, lines, scatter plots, and heatmaps; the useful chart is the one suited to the question and the available columns, not the most elaborate one. See Plotly’s Python documentation.

  • Type mix: compares the number of filtered rows per content type.
  • Release-year distribution: shows the spread of release years in the filtered rows; it does not say when Netflix added a title.
  • Recorded additions: groups valid date_added values by year. It describes dates recorded in the snapshot, not a complete history of Netflix releases.
  • Country or category comparison: can be added from country or listed_in. Decide whether rows count once per title or once for every listed value; if memberships are expanded, label counts as memberships rather than unique titles.

Streamlit renders a Plotly figure through st.plotly_chart. Its documentation accepts a Plotly Figure or Data object and describes the on_select options "ignore", "rerun", or a callback. Selection is ignored by default. To make selecting chart marks update another view, enable selection handling and use the returned selection state; documented selection modes include points, box, and lasso. The selection state is read-only, so it can drive downstream filtering but is not a writable control. More than 1,000 points may use WebGL rendering. Check the current Streamlit chart reference against the version installed for the app.

Rank #4
Google Streamer 4K – Fast Streaming Entertainment with Voice Search Remote, Watch Movies, Shows, Live Channels and Netflix in HDR, Smart Home Control, 32 GB Storage, Porcelain
  • The Google TV Streamer (4K) delivers your favorite entertainment quickly, easily, and personalized to you[1,2]
  • HDMI 2.1 cable required (sold separately)
  • See movies and TV shows from all your services right from your home screen[2]; and find new things to watch with tailored recommendations for everyone in your home based on their interests and viewing habits
  • Watch live TV and access over 800 free channels from Pluto TV, Tubi, and more[3]; if you find an interesting show or movie on your TV, mobile app, or Google search, you can easily add it to your watchlist, so it’s ready when you are[2]
  • Up to 4K HDR with Dolby Vision delivers captivating, true-to-life detail[4]; and you can connect speakers that support Dolby Atmos for more immersive 3D sound
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

What this explorer can—and cannot—tell you

This app is a way to explore the fields and records in one identified CSV. It is not a recommendation engine, and it cannot establish whether a title is currently offered in a particular country or account. The dataset descriptions establish different historical snapshots, not a consistent method for comparing inventory over time. Present any counts or patterns as findings about the chosen file and its snapshot date.

Best Value
Sale
Roku Streaming Stick 4K with Voice Remote - HDR10+ & Dolby Vision
  • Stunning 4K and Dolby Vision streaming made simple: With America’s number 1 TV streaming platform,* exploring popular apps—plus tons of free movies, shows, and live TV—is as easy as it is fun. *Based on hours streamed—Hypothesis Group
  • Breathtaking picture quality: Stunningly sharp 4K picture brings out rich detail in your entertainment with four times the resolution of HD. Watch as colors pop off your screen and enjoy lifelike clarity with Dolby Vision and HDR10+.
  • Seamless streaming for any room: With Roku Streaming Stick 4K, watch your favorite entertainment on any TV in the house, even in rooms farther from your router thanks to the long-range Wi-Fi receiver.
  • Shows on the go: Take your TV to-go when traveling—without needing to log into someone else’s device.
  • Compact without compromises: Our sleek design won’t block neighboring HDMI ports, so you can switch from streaming to gaming with ease. Plus, it’s designed to stay hidden behind your TV, keeping wires neatly out of sight

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Leave a Reply

Your email address will not be published. Required fields are marked *

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Outdated Drivers Are Slowing You DownFree scan - exact matches
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.