diff --git a/pandas/core/reshape/tile.py b/pandas/core/reshape/tile.py index 00a7645d0c7a5..324c28e212e9b 100644 --- a/pandas/core/reshape/tile.py +++ b/pandas/core/reshape/tile.py @@ -345,6 +345,7 @@ def qcut( else: quantiles = q bins = algos.quantile(x, quantiles) + fac, bins = _bins_to_cuts( x, bins, @@ -388,7 +389,19 @@ def _bins_to_cuts( f"You can drop duplicate edges by setting the 'duplicates' kwarg" ) else: - bins = unique_bins + if len(unique_bins) == 1: + raise ValueError( + f"Bin edges must be unique: {repr(bins)}.\n" + ) + bins[0] = bins[0] - 1 + for i in range(1, len(bins)): + if i - 2 < 0: + bins[i] = np.nextafter(bins[i], bins[i] - 1) + else: + bins[i - 1] = (bins[i - 2] + bins[i]) / 2 + unique_bins = algos.unique(bins) + if len(unique_bins) < len(bins) and len(bins) != 2: + bins = unique_bins side = "left" if right else "right" ids = ensure_int64(bins.searchsorted(x, side=side))