sort_values orders the rows by a column, smallest first. Pass ascending=False for largest first:
df.sort_values("revenue", ascending=False)
False is a Python value, so it has no quotes. Text sorts A to Z, and dates sort oldest first as long as they're real dates or written year first.
To sort by several columns, pass lists. The first column decides the order and the next one breaks ties:
df.sort_values(["region", "revenue"], ascending=[True, False])
For the top few rows, sort and take the head, or use nlargest, which does both: df.nlargest(5, "revenue"). nsmallest is its partner.
Sorting returns a new DataFrame and leaves df as it was. Index labels travel with their rows, so after a sort they're out of order. That's normal; reset_index(drop=True) renumbers them if you need it.