diff --git a/doc/source/whatsnew/v0.24.0.txt b/doc/source/whatsnew/v0.24.0.txt index d0aa156cf5059..3f3a01cf6e850 100644 --- a/doc/source/whatsnew/v0.24.0.txt +++ b/doc/source/whatsnew/v0.24.0.txt @@ -210,6 +210,7 @@ Backwards incompatible API changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - A newly constructed empty :class:`DataFrame` with integer as the ``dtype`` will now only be cast to ``float64`` if ``index`` is specified (:issue:`22858`) +- :meth:`Series.str.cat` will now raise if `others` is a `set` (:issue:`23009`) .. _whatsnew_0240.api_breaking.deps: diff --git a/pandas/core/strings.py b/pandas/core/strings.py index 4086021bc61a6..c824ad1712a5a 100644 --- a/pandas/core/strings.py +++ b/pandas/core/strings.py @@ -1996,12 +1996,12 @@ def _get_series_list(self, others, ignore_index=False): elif isinstance(others, np.ndarray) and others.ndim == 2: others = DataFrame(others, index=idx) return ([others[x] for x in others], False) - elif is_list_like(others): + elif is_list_like(others, allow_sets=False): others = list(others) # ensure iterators do not get read twice etc # in case of list-like `others`, all elements must be # either one-dimensional list-likes or scalars - if all(is_list_like(x) for x in others): + if all(is_list_like(x, allow_sets=False) for x in others): los = [] join_warn = False depr_warn = False diff --git a/pandas/tests/test_strings.py b/pandas/tests/test_strings.py index 75b1bcb8b2938..87bf89229a64e 100644 --- a/pandas/tests/test_strings.py +++ b/pandas/tests/test_strings.py @@ -301,7 +301,17 @@ def test_str_cat_mixed_inputs(self, box): with tm.assert_raises_regex(TypeError, rgx): s.str.cat([u, [u, d]]) - # forbidden input type, e.g. int + # forbidden input type: set + # GH 23009 + with tm.assert_raises_regex(TypeError, rgx): + s.str.cat(set(u)) + + # forbidden input type: set in list + # GH 23009 + with tm.assert_raises_regex(TypeError, rgx): + s.str.cat([u, set(u)]) + + # other forbidden input type, e.g. int with tm.assert_raises_regex(TypeError, rgx): s.str.cat(1)