diff --git a/pandas/io/parsers/arrow_parser_wrapper.py b/pandas/io/parsers/arrow_parser_wrapper.py index 5786073c9d9cc..037239e4ec83c 100644 --- a/pandas/io/parsers/arrow_parser_wrapper.py +++ b/pandas/io/parsers/arrow_parser_wrapper.py @@ -295,7 +295,15 @@ def read(self) -> DataFrame: dtype_mapping[pa.null()] = pd.Int64Dtype() frame = table.to_pandas(types_mapper=dtype_mapping.get) elif using_pyarrow_string_dtype(): - frame = table.to_pandas(types_mapper=arrow_string_types_mapper()) + + def types_mapper(dtype): + dtype_dict = self.kwds["dtype"] + if dtype_dict is not None and dtype_dict.get(dtype, None) is not None: + return dtype_dict.get(dtype) + return arrow_string_types_mapper()(dtype) + + frame = table.to_pandas(types_mapper=types_mapper) + else: if isinstance(self.kwds.get("dtype"), dict): frame = table.to_pandas(types_mapper=self.kwds["dtype"].get)