diff --git a/pandas/core/dtypes/astype.py b/pandas/core/dtypes/astype.py index 1e78bf0cd33ae..7636cd9080107 100644 --- a/pandas/core/dtypes/astype.py +++ b/pandas/core/dtypes/astype.py @@ -224,7 +224,7 @@ def astype_array(values: ArrayLike, dtype: DtypeObj, copy: bool = False) -> Arra values = values.astype(dtype, copy=copy) else: - values = astype_nansafe(values, dtype, copy=copy) + values = astype_nansafe(values, dtype, copy=copy, skipna=True) # in pandas we don't store numpy str dtypes, so convert to object if isinstance(dtype, np.dtype) and issubclass(values.dtype.type, str): diff --git a/pandas/tests/dtypes/test_dtypes.py b/pandas/tests/dtypes/test_dtypes.py index f077317e7ebbe..ecde19ab48911 100644 --- a/pandas/tests/dtypes/test_dtypes.py +++ b/pandas/tests/dtypes/test_dtypes.py @@ -1107,3 +1107,15 @@ def test_compare_complex_dtypes(): with pytest.raises(TypeError, match=msg): df.lt(df.astype(object)) + + +@pytest.mark.parametrize( + "array", + [(["foo", "bar", pd.NA]), (["foo", "bar", np.NaN]), (["foo", "bar", None])], +) +def test_skip_convert_nan_values_to_strings(array): + # GH 44156 + result = Series(array).astype("str") + expected = Series(array) + + tm.assert_series_equal(result, expected)