Set Data Type in Python for Data Science – Complete Guide 2026
The set is Python’s built-in unordered collection of unique elements. It is one of the most powerful and frequently used data structures in data science because it automatically removes duplicates, provides lightning-fast membership testing, and supports powerful mathematical set operations.
TL;DR — Why Sets Matter in Data Science 2026
- Automatic deduplication
- O(1) membership testing (
inis extremely fast) - Mathematical operations: union, intersection, difference
- Works with tuples (hashable) but not with lists or other sets
1. Creating and Basic Operations
# Creating a set
regions = {"North", "South", "East", "North", "West"} # duplicates removed
print(regions) # {'North', 'South', 'East', 'West'}
# From a list or a DataFrame column (common pattern)
import pandas as pd
df = pd.DataFrame({"customer_id": [101, 102, 101, 103], "region": ["North", "South", "North", "East"]})
unique_customers = set(df["customer_id"])
print(unique_customers) # {101, 102, 103}
# Empty set (note the syntax)
empty_set = set()
2. Adding, Removing and Checking Membership
features = set()
features.add("amount")
features.add("profit")
features.add("amount") # duplicate ignored
print("profit" in features) # True - O(1) lookup
features.remove("profit") # raises error if not present
features.discard("missing") # safe removal
3. Real-World Data Science Examples
import pandas as pd
# Small inline sample so this example runs as-is.
# In a real project you would load it: df = pd.read_csv("sales_data.csv")
df = pd.DataFrame({
"customer_id": [101, 102, 103, 104, 105, 106],
"customer_name": ["Ana", "Ben", "Chen", "Dana", "Eli", "Fay"],
"order_date": ["2026-01-05", "2026-01-12", "2026-02-03",
"2026-02-18", "2026-03-01", "2026-03-09"],
"amount": [1250.75, 890.50, 2340.00, 1780.25, 2615.40, 450.00],
"quantity": [3, 2, 5, 4, 6, 1],
"profit": [312.69, 222.63, 585.00, 445.06, 653.85, 112.50],
"region": ["North", "South", "East", "North", "West", "South"],
"category": ["Electronics", "Books", "Electronics", "Home", "Home", "Books"],
"rating": [5, 4, None, 3, 5, 4],
})
# Example 1: Unique combinations using tuples inside sets
unique_pairs = set((row.region, row.category) for row in df.itertuples())
print(f"Unique region-category pairs: {len(unique_pairs)}")
# Example 2: Fast membership testing for filtering
high_value_ids = {101, 203, 305, 407}
filtered = [row for row in df.itertuples() if row.customer_id in high_value_ids]
# Example 3: Set operations for comparing datasets
train_features = {"amount", "quantity", "profit", "region"}
test_features = {"amount", "profit", "category", "log_amount"}
common = train_features & test_features
only_train = train_features - test_features
all_features = train_features | test_features
4. frozenset – Hashable Version of Set
# frozenset can be used as dict key or inside another set
frozen_pairs = frozenset((row.customer_id, row.region) for row in df.itertuples())
config = {frozen_pairs: "Processed"}
5. Best Practices in 2026
- Use
set()whenever you need uniqueness or fast lookup - Store combinations as tuples inside sets (tuples are hashable)
- Use
frozensetwhen the set itself needs to be hashable - Prefer sets over lists for deduplication and membership checks on large data
- Convert back to list only when order matters (
list(my_set))
What Makes Sets Fast
A set is a hash table without values. When you write x in my_set, Python computes hash(x), jumps to the matching slot and compares only the few elements stored there. For a list, x in my_list compares against every element until it finds a match. That is why sets are the right tool for repeated membership checks and deduplication.
The trade-off: sets have no order and no indexing (my_set[0] is an error), elements must be hashable, and duplicates are dropped silently. If you need counts of duplicates rather than just unique values, use collections.Counter.
Worked Example: Validating Incoming IDs
known_customers = {101, 102, 103, 104, 105}
batch = [101, 107, 103, 103, 110, 105]
batch_ids = set(batch)
valid = batch_ids & known_customers # intersection
unknown = batch_ids - known_customers # difference
duplicates = len(batch) - len(batch_ids)
print("Valid:", sorted(valid)) # [101, 103, 105]
print("Unknown:", sorted(unknown)) # [107, 110]
print("Duplicate rows:", duplicates) # 1
# Subset and disjoint checks
print({101, 103} <= known_customers) # True: subset
print(batch_ids.isdisjoint({200, 300})) # True: nothing in common
Three short set expressions replace nested loops, and the intent of each line — valid, unknown, duplicates — is obvious to the next reader.
Common Mistakes
- Creating an empty set with
{}: that is a dict; useset() - Calling
set("North"): it gives the letters{'N', 'o', 'r', 't', 'h'}; use{"North"} - Relying on set order in reports or tests; sort the result first
- Using
remove()for values that may be missing: it raisesKeyError; usediscard()
Quick Summary
- Sets store unique, hashable values with fast membership tests
- Use
&,|,-and^to compare groups - Use
frozensetwhen a set must itself be hashable
Conclusion
The set data type is a hidden gem in data science. In 2026, it is the go-to solution for removing duplicates, fast membership testing, comparing feature sets, and storing unique combinations (especially with tuples). Using sets correctly can dramatically simplify and speed up your data cleaning, feature selection, and validation code.
Next steps:
- Review any code where you manually check for duplicates or use
inon lists and replace them with sets