Pandas DataFrame: How to group rows by ranges of values

Updated: February 21, 2024 By: Guest Contributor Post a comment


Mastering the manipulation of data is a cornerstone of becoming proficient in data science and analysis. One such powerful tool for handling large datasets is Pandas, a highly revered Python library. In this tutorial, we’ll delve into how you can group rows in a Pandas DataFrame based on specified ranges of values. Understanding this will unlock new levels of data manipulation, enabling more sophisticated analyses.

Getting Started

Before diving into the specifics, ensure you have Pandas installed in your Python environment. You can install it via pip:

pip install pandas

Now, let’s import Pandas and create a simple DataFrame for our examples:

import pandas as pd

data = {
    'Score': [88, 92, 79, 93, 85, 78, 82, 91, 76, 94],
    'Name': ['Alex', 'Bob', 'Clarice', 'Dalia', 'Evan','Fiona', 'George', 'Haley', 'Ivan', 'Jackie']
df = pd.DataFrame(data)

This provides us with a basic DataFrame containing names and their corresponding scores.

Simple Grouping by Score Ranges

Let’s start by creating groups based on score ranges. We’ll divide our data into ‘Low’, ‘Medium’, and ‘High’ performance categories:

bins = [0, 80, 90, 100]
labels = ['Low', 'Medium', 'High']
df['Category'] = pd.cut(df['Score'], bins=bins, labels=labels)

This segment of code creates a new column in our DataFrame, categorizing each score into the designated buckets.

More Complex Grouping

For a more nuanced approach, we might want to create bins of variable sizes, consider additional columns, or apply custom functions. Let’s add a column for age and then group based on age and score:

df['Age'] = [18, 19, 21, 20, 22, 18, 19, 20, 21, 22]
bins = [0, 19, 21, 100]
labels = ['Teenager', 'Young Adult', 'Adult']
df['Age Group'] = pd.cut(df['Age'], bins=bins, labels=labels)

This approach allows for more detailed analysis, creating intersections between different datasets and visualizations.

Advanced Data Grouping

Advancing even further, we can aggregate our data based on these groupings. This is particularly helpful when we want to calculate statistics for each group. Here’s how:

grouped_df = df.groupby(['Category', 'Age Group']).agg({
    'Score': ['mean', 'min', 'max']

Presenting data this way helps illustrate the distribution within each subgroup, providing insights not readily apparent.

Dynamic Binning

In instances where static bins may not suffice, dynamic binning based on dataset characteristics, like quantiles, can be more practical. For instance:

quantile_bins = pd.qcut(df['Score'], q=4)

This code segments scores into quartiles, adapting the bin sizes to the data distribution, ensuring each bin is populated evenly.

Handling Missing Values

Dealing with missing values is critical when grouping data. Let’s consider how ‘pd.cut’ and ‘pd.qcut’ handle NaN values and how to manage them:

df.loc[5, 'Score'] = None
df['Category'] = pd.cut(df['Score'], bins=bins, labels=labels, include_lowest=True)

The ‘include_lowest’ parameter ensures that even the lowest value, including NaN, is categorized, avoiding dropping or incorrectly classifying data.

Using Custom Functions

Sometimes, predefined functions or methods don’t offer the flexibility required for a particular analysis. Here’s how to apply a custom function to group data in your DF:

def custom_bin(row):
    if row['Score'] >= 90:
        return 'High'
    elif row['Score'] >= 80:
        return 'Medium'
        return 'Low'

df['Custom Category'] = df.apply(custom_bin, axis=1)

This method allows for complex logic that can incorporate multiple columns and conditions, offering unmatched flexibility.


In this tutorial, we’ve traversed the landscape of grouping rows by ranges of values in Pandas DataFrames. From simple categorization to more complex, condition-based groupings, the flexibility and power of Pandas allow for deep and insightful data analysis. Whether you’re summarizing datasets, searching for patterns, or preparing data for visualization, the techniques demonstrated here will significantly contribute to your data manipulation toolkit.