bins = 7 edges = np.linspace(df.value.min(), df.value.max(), bins+1).astype(int) labels = [f'({edges[i]}, {edges[i+1]}]' for i in range(len(edges)-1)] df['bin'] = pd.cut(df.value, bins=bins, labels=labels) # value bin # 1 8 (0, 53] # 2 16 (0, 53] # .. ... ... # 45 360 (322, 376] # 46 368 (322, 376]