The index is the set of row labels on the left. Making a column the index turns it into a fast lookup:
cust = customers.set_index("customer_id")
cust.loc["C017", "city"]
reset_index() moves the index back into a column, which is how you turn a groupby result into a flat table. reset_index(drop=True) throws the old labels away and renumbers from 0, which you want after sorting or filtering.
df.join(other, on="key") matches df's key column against other's index. It's a shortcut for a left merge when the other table is indexed by the key. If both tables have a column with the same name, pass lsuffix= or rsuffix=.
sort_index() sorts by the labels instead of a column.