From 661c30857312abbabdb36ff7b03d2dbe16787c6b Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 29 Jul 2020 19:55:12 -0500 Subject: [PATCH 1/4] Handle str better --- pandas/core/frame.py | 2 ++ pandas/core/internals/managers.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 3f634c1e6e1ff..3799ce2f10d5e 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -1370,6 +1370,8 @@ def to_numpy( result = self._mgr.as_array( transpose=self._AXIS_REVERSED, dtype=dtype, copy=copy, na_value=na_value ) + if result.dtype is not dtype: + result = np.array(result, dtype=dtype, copy=False) return result diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 895385b170c91..382b8d9481df5 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -847,7 +847,7 @@ def _interleave(self, dtype=None, na_value=lib.no_default) -> np.ndarray: # Give EAs some input on what happens here. Sparse needs this. if isinstance(dtype, SparseDtype): dtype = dtype.subtype - elif is_extension_array_dtype(dtype): + elif is_extension_array_dtype(dtype) or is_dtype_equal(dtype, str): dtype = "object" result = np.empty(self.shape, dtype=dtype) From 73db6938e903b4ed4e11c20502c6977d5cf9f97b Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 29 Jul 2020 20:07:46 -0500 Subject: [PATCH 2/4] Doc and test --- doc/source/whatsnew/v1.1.1.rst | 2 +- pandas/tests/frame/test_api.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v1.1.1.rst b/doc/source/whatsnew/v1.1.1.rst index 443589308ad4c..b313a718578fc 100644 --- a/doc/source/whatsnew/v1.1.1.rst +++ b/doc/source/whatsnew/v1.1.1.rst @@ -15,7 +15,7 @@ including other versions of pandas. Fixed regressions ~~~~~~~~~~~~~~~~~ -- +- Regression where :meth:`DataFrame.to_numpy` would raise a ``RuntimeError`` for mixed dtypes when converting to ``str`` (:issue:`35455`) - - diff --git a/pandas/tests/frame/test_api.py b/pandas/tests/frame/test_api.py index 2b79fc8cd3406..cc57a3970d18b 100644 --- a/pandas/tests/frame/test_api.py +++ b/pandas/tests/frame/test_api.py @@ -367,6 +367,13 @@ def test_to_numpy_copy(self): assert df.to_numpy(copy=False).base is arr assert df.to_numpy(copy=True).base is not arr + def test_to_numpy_mixed_dtype_to_str(self): + # https://github.com/pandas-dev/pandas/issues/35455 + df = pd.DataFrame([[pd.Timestamp("2020-01-01 00:00:00"), 100.0]]) + result = df.to_numpy(dtype=str) + expected = np.array([["2020-01-01 00:00:00", "100.0"]], dtype=str) + tm.assert_numpy_array_equal(result, expected) + def test_swapaxes(self): df = DataFrame(np.random.randn(10, 5)) tm.assert_frame_equal(df.T, df.swapaxes(0, 1)) From 6f45bcad738763fa3b835a29b34c97499de18453 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Fri, 7 Aug 2020 16:44:21 -0500 Subject: [PATCH 3/4] Make an elif --- pandas/core/internals/managers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 382b8d9481df5..7b449bd528242 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -847,7 +847,9 @@ def _interleave(self, dtype=None, na_value=lib.no_default) -> np.ndarray: # Give EAs some input on what happens here. Sparse needs this. if isinstance(dtype, SparseDtype): dtype = dtype.subtype - elif is_extension_array_dtype(dtype) or is_dtype_equal(dtype, str): + elif is_extension_array_dtype(dtype): + dtype = "object" + elif is_dtype_equal(dtype, str): dtype = "object" result = np.empty(self.shape, dtype=dtype) From 61beac7f2b00b0f898381bd2a39f737f8bfaa605 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Fri, 7 Aug 2020 17:14:01 -0500 Subject: [PATCH 4/4] Add back import --- pandas/core/internals/managers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 4fc3150769af6..aa74d173d69b3 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -19,6 +19,7 @@ from pandas.core.dtypes.common import ( DT64NS_DTYPE, is_datetimelike_v_numeric, + is_dtype_equal, is_extension_array_dtype, is_list_like, is_numeric_v_string_like,