pd.cut puts each number into a band (a bin) that you define by its edges:
pd.cut(df["revenue"], bins=[0, 100, 300, 2000], labels=["small", "medium", "large"])
By default each bin includes its right edge and excludes its left: (100, 300], so exactly 300 is "medium". Pass right=False to flip that, making bins like [100, 300) where exactly 300 falls in the next bin up. Values on a border are where most binning mistakes come from, so check them.
pd.qcut(col, 4) instead makes bins with the same number of rows in each (quartiles), which is handy for "top quarter of customers" questions.
The result is a categorical column: count it with value_counts() or group by it like any other column.