Pandas Data Binning (cut / qcut)

Data binning (also called bucketing) is the process of discretizing continuous variables, commonly used in data preprocessing, feature engineering, and data analysis.


cut equal-width binning

cutDivide the data into intervals of equal width.

Example

import pandas as pd
import numpy as np

# Create age data
ages = pd.Series([5, 15, 25, 35, 45, 55, 65, 75, 85])

print("Original data:")
print(ages.tolist())
print()

# Equal-width binning (5 intervals)
bins = [0, 20, 40, 60, 80, 100]
labels = ["Child", "Youth", "Middle-aged", "Pre-elderly", "Elderly"]

age_bins = pd.cut(ages, bins=bins, labels=labels)
print("Equal-width binning result:")
print(age_bins)
print()

# Include right boundary
age_bins2 = pd.cut(ages, bins=4)
print("Automatic equal-width binning:")
print(age_bins2)

Return categories and boundaries

Example

import pandas as pd
import numpy as np

ages = pd.Series([5, 15, 25, 35, 45])

# Return interval indices
result = pd.cut(ages, bins=4, labels=False)
print("Interval indices:")
print(result)
print()

# Return interval boundaries
result = pd.cut(ages, bins=4, retbins=True)
print("Interval boundaries:")
print(result[1])

qcut equal-frequency binning

qcutDivide the data into intervals with roughly the same number of data points.

Example

import pandas as pd
import numpy as np

# Unevenly distributed data
data = pd.Series([1, 1, 1, 2, 3, 4, 5, 10, 20, 30, 50, 100])

print("Original data:")
print(data.tolist())
print()

# Equal-width binning (can cause uneven distribution)
cut_result = pd.cut(data, q=4)
print("Equal-width binning:")
print(cut_result.value_counts())
print()

# Equal-frequency binning (roughly the same number of data points per interval)
qcut_result = pd.qcut(data, q=4)
print("Equal-frequency binning:")
print(qcut_result.value_counts())

Specify quantiles

Example

import pandas as pd

data = pd.Series(range(1, 101))

# Divide by specified quantiles
result = pd.qcut(data, q=[0, 0.1, 0.3, 0.7, 0.9, 1])
print("Divided by quantiles:")
print(result.value_counts().sort_index())

Practice: Data Analysis

Example

import pandas as pd
import numpy as np

# Simulate customer spending data
np.random.seed(42)
customers = pd.DataFrame({
    "Customer ID": range(1, 101),
    "Spending amount": np.random.exponential(500, 100) + 100
})

# Bin into different spending levels
customers["Spending level"] = pd.cut(
    customers["Spending amount"],
    bins=[0, 300, 500, 800, float("inf")],
    labels=["Low", "Medium", "High", "VIP"]
)

# Count customers in each level
print("Spending level distribution:")
print(customers["Spending level"].value_counts())
print()

# Calculate average spending by level
print("Average spending by level:")
print(customers.groupby("Spending level")["Spending amount"].mean().round(2))
Other Extensions