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)
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])
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())
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())
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))
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))