How to Find Airbnb Hosts With Multiple Listings in Python
On this page
Problem statement
The image of Airbnb is a resident renting a spare room, but in most cities a large share of listings belongs to hosts with many of them, from small investors to property-management companies running hundreds of units. Measuring that concentration is a common policy question and a simple count on the face of it. In practice the count depends on which host-listing field is used, on whether listings outside the city count, and on how "commercial" is defined.
This page measures host concentration in the Inside Airbnb snapshot for Washington, D.C. of 24 June 2026. It counts listings per host, finds the share run by multi-listing hosts, profiles the largest hosts, and compares Inside Airbnb's calculated count with the host's self-reported total.
Quick answer
Count listings per host in the snapshot and group hosts by size:
per_host = L.groupby("host_id").size()
size = pd.cut(per_host, [0, 1, 2, 10, 50, 10_000], labels=["1", "2", "3-10", "11-50", "51+"])
summary = pd.DataFrame({"hosts": size.value_counts(sort=False), "listings": per_host.groupby(size, observed=False).sum()})
summary["share of listings"] = (summary.listings / summary.listings.sum()).map("{:.0%}".format)
print(summary.to_string())
hosts listings share of listings
1 2356 2356 34%
2 408 816 12%
3-10 392 1730 25%
11-50 55 1141 16%
51+ 7 902 13%
2,356 hosts have a single listing, together 34% of all listings. The 62 hosts with more than 10 listings hold 29% between them, and the 7 with more than 50 hold 13%.
Concentration, the largest hosts, which count to use
1. Concentration
top = per_host.sort_values(ascending=False)
print(f"hosts: {len(per_host):,}; listings: {per_host.sum():,}")
print(f"largest 10 hosts hold {top.head(10).sum() / per_host.sum():.0%} of listings; largest 1% of hosts ({max(1, len(top) // 100)}) hold {top.head(max(1, len(top) // 100)).sum() / per_host.sum():.0%}")
print(f"listings belonging to hosts with more than one: {(L.host_id.map(per_host) > 1).mean():.0%}")
hosts: 3,218; listings: 6,945
largest 10 hosts hold 15% of listings; largest 1% of hosts (32) hold 24%
listings belonging to hosts with more than one: 66%
The 3,218 hosts share 6,945 listings. The 10 largest hold 15% of them and the largest 1%, 32 hosts, hold 24%. Two thirds of listings, 66%, belong to hosts with more than one.
2. Who the largest hosts are
big = L[L.host_id.isin(top.head(5).index)].groupby(["host_id", "host_name"]).agg(
listings=("id", "size"), entire=("room_type", lambda s: (s == "Entire home/apt").mean()),
median_price=("price_usd", "median"), long_stay=("minimum_nights", lambda s: (s >= 30).mean())).sort_values("listings", ascending=False)
print(big.round(2).to_string())
listings entire median_price long_stay
host_id host_name
39930655 Sojourn 282 0.99 198.30 0.65
107434423 Blueground 193 1.00 187.19 1.00
446820235 Luxury Bookings Fze 130 0.99 659.20 0.07
46630199 Home Sweet City 89 1.00 268.00 0.03
501999278 RoomPicks 81 0.00 330.35 0.00
The largest hosts are companies, and they run different businesses. Sojourn (282 listings) and Blueground (193) offer entire homes mostly for stays of 30 nights or more. Luxury Bookings lists 130 entire homes at a median of $659 a night. RoomPicks lists 81 rooms, none of them entire homes.
3. Which count to use
calculated_host_listings_count counts a host's listings in this city's snapshot; host_listings_count is the count Airbnb's host profile reports, which can include other cities; host_total_listings_count is a second profile count:
print("non-empty values:", L[["calculated_host_listings_count", "host_listings_count", "host_total_listings_count"]].notna().sum().to_dict())
c = L.drop_duplicates("host_id").dropna(subset=["host_listings_count"])
print(f"hosts whose profile count equals the local count: {(c.host_listings_count == c.calculated_host_listings_count).mean():.0%}; profile count larger: {(c.host_listings_count > c.calculated_host_listings_count).mean():.0%}")
print(f"calculated count equals our own groupby for every host: {(L.drop_duplicates('host_id').set_index('host_id').calculated_host_listings_count == per_host.reindex(L.drop_duplicates('host_id').host_id).values).all()}")
non-empty values: {'calculated_host_listings_count': 6945, 'host_listings_count': 6896, 'host_total_listings_count': 0}
hosts whose profile count equals the local count: 80%; profile count larger: 19%
calculated count equals our own groupby for every host: True
In this snapshot host_total_listings_count is entirely empty, a reminder that columns vary between releases. For 80% of hosts the profile count equals the local count, and for 19% it is larger. The calculated count matches a groupby on host_id exactly.
Single-listing hosts and entire homes
The data used on this page
The Inside Airbnb listings for Washington, D.C. from the snapshot of 24 June 2026 (CC BY 4.0). Host names are shown as Airbnb displays them publicly; most large hosts are companies.
from pathlib import Path
import numpy as np
import pandas as pd
import requests
Path("data").mkdir(exist_ok=True)
BASE = "https://data.insideairbnb.com/united-states/dc/washington-dc/2026-06-24"
p = Path("data/listings.csv.gz")
if not p.exists():
r = requests.get(f"{BASE}/data/listings.csv.gz", timeout=600); r.raise_for_status(); p.write_bytes(r.content)
L = pd.read_csv(p)
L["price_usd"] = pd.to_numeric(L.price.str.replace(r"[$,]", "", regex=True), errors="coerce")
print(f"{len(L):,} listings")
6,945 listings
The snapshot has 6,945 listings.
Example 1: single-listing hosts and entire homes
A common definition of "commercial" is a host with several entire-home listings. Compare entire-home listings by host size:
L["host_size"] = L.host_id.map(per_host)
eh = L[L.room_type == "Entire home/apt"]
print(f"entire homes run by hosts with 1 listing: {(eh.host_size == 1).mean():.0%}; with 2-10: {eh.host_size.between(2, 10).mean():.0%}; with more than 10: {(eh.host_size > 10).mean():.0%}")
entire homes run by hosts with 1 listing: 41%; with 2-10: 32%; with more than 10: 27%
Of entire homes, 41% belong to single-listing hosts, 32% to hosts with 2 to 10 listings, and 27% to hosts with more than 10.
Counting listings per host
Each Inside Airbnb listing carries its host's ID, and counting listings per ID gives each host's footprint in the snapshot. That is what calculated_host_listings_count already records, split by room type. Host size distributions in large cities are strongly skewed: most hosts have a single listing, yet a minority of large hosts control a large share of all listings, especially entire homes. That gap between the typical host and the typical listing is central to debates about short-term rentals and housing supply, and the right summary is the share of listings by host size, not the share of hosts.
The count has limits. A single company can operate under several host accounts, which splits it in the data, and one account can be a manager listing units for many owners. Listings on other platforms, or rented off-platform, are invisible. The count on a host's profile can include listings in other cities, so it differs from the local count for hosts active elsewhere. Definitions of "commercial" vary between cities, from two entire homes to a number of nights, so state the rule used.
Snapshots, hotels and privacy
- Snapshots: host portfolios change; compare several snapshots before calling a host stable.
- Hotels: some large "hosts" are serviced apartments or hotels listing rooms;
room_type == "Hotel room"and the host name help separate them. - Privacy: host names and IDs are public on Airbnb, but analyses should report companies, not private individuals.
- Long stays: large hosts often list furnished monthly rentals; check minimum nights before calling them short-term.
Internal links
- How to analyse Inside Airbnb listings in Python β the listings
- Inside Airbnb data explained β what the fields mean
- How to estimate Airbnb occupancy from calendars in Python β how busy they are
FAQ
How do I find Airbnb hosts with multiple listings?
Group the Inside Airbnb listings by host_id and count, or use calculated_host_listings_count.
What share of Airbnb listings belong to multi-listing hosts?
It depends on the city; in D.C. a majority of listings belong to hosts with more than one listing.
What is the difference between host_listings_count and calculated_host_listings_count?
The first comes from the host's profile and can include other cities; the second counts the host's listings in this snapshot.
How do I identify commercial Airbnb hosts?
Define a rule, such as more than one entire-home listing, and apply it to the listings per host; definitions vary by city.