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.