What is GroupBy?

GroupBy splits data into groups based on some criteria, applies a function to each group, and combines the results. It's essential for data analysis and aggregation.

Basic GroupBy

Group by a single column:

import pandas as pd

df = pd.DataFrame({
    'city': ['NYC', 'LA', 'NYC', 'LA', 'NYC'],
    'sales': [100, 200, 150, 250, 120]
})

# Group by city
grouped = df.groupby('city')

# Get mean sales per city
mean_sales = df.groupby('city')['sales'].mean()
# NYC: 123.33, LA: 225.0

Common Aggregations

Apply different aggregation functions:

# Single aggregation
df.groupby('city')['sales'].sum()      # Sum
df.groupby('city')['sales'].mean()     # Mean
df.groupby('city')['sales'].max()      # Maximum
df.groupby('city')['sales'].min()      # Minimum
df.groupby('city')['sales'].count()    # Count
df.groupby('city')['sales'].std()      # Standard deviation

Multiple Aggregations

Apply multiple functions at once:

# Using agg()
df.groupby('city')['sales'].agg(['sum', 'mean', 'count'])

# Custom names
df.groupby('city')['sales'].agg(
    total='sum',
    average='mean',
    count='count'
)

Grouping by Multiple Columns

Group by multiple criteria:

df = pd.DataFrame({
    'city': ['NYC', 'LA', 'NYC', 'LA'],
    'product': ['A', 'A', 'B', 'B'],
    'sales': [100, 200, 150, 250]
})

# Group by city and product
result = df.groupby(['city', 'product'])['sales'].sum()

Applying Multiple Functions to Multiple Columns

Different aggregations for different columns:

df.groupby('city').agg({
    'sales': 'sum',
    'quantity': 'mean',
    'price': ['min', 'max']
})

Iterating Over Groups

Iterate through groups:

for city, group in df.groupby('city'):
    print(f"City: {city}")
    print(group)
    print()

Transform and Apply

Apply custom functions:

# Transform (returns same shape)
df['sales_normalized'] = df.groupby('city')['sales'].transform(
    lambda x: (x - x.mean()) / x.std()
)

# Apply custom function
def custom_agg(group):
    return group['sales'].sum() / group['quantity'].sum()

result = df.groupby('city').apply(custom_agg)

Filtering Groups

Filter groups based on aggregate values:

# Groups with sum > 500
filtered = df.groupby('city').filter(lambda x: x['sales'].sum() > 500)

Best Practices

  • Use vectorized operations: Faster than loops
  • Select columns before grouping: More efficient
  • Use named aggregations: Clearer code
  • Reset index if needed: After grouping operations

Next Steps

Learn about DataFrames for more operations, or explore filtering to prepare data for grouping.