Skip to content

Commit 174dc3d

Browse files
committed
Add case for non list, simplify condition block and extra test for cut
1 parent a1fb3a1 commit 174dc3d

File tree

3 files changed

+24
-12
lines changed

3 files changed

+24
-12
lines changed

pandas/core/reshape/tile.py

+11-9
Original file line numberDiff line numberDiff line change
@@ -393,20 +393,22 @@ def _bins_to_cuts(
393393
has_nas = na_mask.any()
394394

395395
if labels is not False:
396-
if labels is None:
396+
if not (labels is None or is_list_like(labels)):
397+
raise ValueError(
398+
"Bin labels must either be False, None or passed in as a "
399+
"list-like argument"
400+
)
401+
402+
elif labels is None:
397403
labels = _format_labels(
398404
bins, precision, right=right, include_lowest=include_lowest, dtype=dtype
399405
)
400-
elif labels is True:
406+
407+
elif len(labels) != len(bins) - 1:
401408
raise ValueError(
402-
"User desired bin labels must be passed in as an argument, "
403-
"not just `True`"
409+
"Bin labels must be one fewer than the number of bin edges"
404410
)
405-
elif is_list_like(labels):
406-
if len(labels) != len(bins) - 1:
407-
raise ValueError(
408-
"Bin labels must be one fewer than the number of bin edges"
409-
)
411+
410412
if not is_categorical_dtype(labels):
411413
labels = Categorical(labels, categories=labels, ordered=True)
412414

pandas/tests/reshape/test_cut.py

+9
Original file line numberDiff line numberDiff line change
@@ -603,3 +603,12 @@ def test_cut_bool_coercion_to_int(bins, box, compare):
603603
expected = cut(data_expected, bins, duplicates="drop")
604604
result = cut(data_result, bins, duplicates="drop")
605605
compare(result, expected)
606+
607+
608+
@pytest.mark.parametrize("labels", ["foo", 1, True])
609+
def test_cut_incorrect_labels(labels):
610+
# GH 13318
611+
values = range(5)
612+
msg = "Bin labels must either be False, None or passed in as a list-like argument"
613+
with pytest.raises(ValueError, match=msg):
614+
cut(values, 4, labels=labels)

pandas/tests/reshape/test_qcut.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,13 @@ def test_qcut_return_intervals():
130130
tm.assert_series_equal(res, exp)
131131

132132

133-
def test_qcut_labels_true():
133+
@pytest.mark.parametrize("labels", ["foo", 1, True])
134+
def test_qcut_incorrect_labels(labels):
134135
# GH 13318
135136
values = range(5)
136-
msg = "User desired bin labels must be passed in as an argument, not just `True`"
137+
msg = "Bin labels must either be False, None or passed in as a list-like argument"
137138
with pytest.raises(ValueError, match=msg):
138-
qcut(values, 4, labels=True)
139+
qcut(values, 4, labels=labels)
139140

140141

141142
@pytest.mark.parametrize("labels", [["a", "b", "c"], list(range(3))])

0 commit comments

Comments
 (0)