You can use the following syntax to group rows in a pandas DataFrame and then sort the values within groups:
df.sort_values(['var1','var2'],ascending=False).groupby('var1').head()
The following example shows how to use this syntax in practice.
Example: Use GroupBy & Sort Within Groups in Pandas
Suppose we have the following pandas DataFrame that shows the sales made at two different store locations:
import pandas as pd
#create DataFrame
df = pd.DataFrame({'store': ['B', 'B', 'A', 'A', 'B', 'B', 'A', 'A'],
'sales': [12, 25, 8, 14, 10, 20, 30, 30]})
#view DataFrame
print(df)
store sales
0 B 12
1 B 25
2 A 8
3 A 14
4 B 10
5 B 20
6 A 30
7 A 30
We can use the following syntax to group the rows by the store column and sort in descending order based on the sales column:
#group by store and sort by sales values in descending order
df.sort_values(['store','sales'],ascending=False).groupby('store').head()
store sales
1 B 25
5 B 20
0 B 12
4 B 10
6 A 30
7 A 30
3 A 14
2 A 8
Note that we could also drop the ascending=False argument to sort the sales values in ascending order:
#group by store and sort by sales values in ascending order
df.sort_values(['store','sales']).groupby('store').head()
store sales
2 A 8
3 A 14
6 A 30
7 A 30
4 B 10
0 B 12
5 B 20
1 B 25
Note that the head() function only displays the first 5 values by group.
To display the top n values by group, simply use head(n) instead.
Note: You can find the complete documentation for the GroupBy operation in pandas here.
Additional Resources
The following tutorials explain how to perform other common operations in pandas:
Pandas: How to Calculate Cumulative Sum by Group
Pandas: How to Count Unique Values by Group
Pandas: How to Calculate Correlation By Group