Skip to content

"errors" parameter has no effect on pd.DataFrame.astype if a dictionary is passed in as the dtype argument #25905

Closed
@nandrea1

Description

@nandrea1

Code Sample, a copy-pastable example if possible

Given the code sample below:

data_df = pd.DataFrame([{'col_a': '1', 'col_b': '16.5%', 'col_c': 'test'},
                        {'col_a': '2.2', 'col_b': '15.3', 'col_c': 'another_test'}
                       ]) 
type_dict = {'col_a': 'float64', 'col_b': 'float64', 'col_c': 'object}
data_df = data_df.astype(dtype=type_dict, errors='ignore')

Problem description

Pandas will raise the error ValueError: could not convert string to float: '16.5%' despite the fact that the errors='ignore' parameter was passed in. This is probable due to the implementation of astype, as can be seen in pandas.core.generic.py lines 5658 - 5680

        if is_dict_like(dtype):
            if self.ndim == 1:  # i.e. Series
                if len(dtype) > 1 or self.name not in dtype:
                    raise KeyError('Only the Series name can be used for '
                                   'the key in Series dtype mappings.')
                new_type = dtype[self.name]
                return self.astype(new_type, copy, errors, **kwargs)
            elif self.ndim > 2:
                raise NotImplementedError(
                    'astype() only accepts a dtype arg of type dict when '
                    'invoked on Series and DataFrames. A single dtype must be '
                    'specified when invoked on a Panel.'
                )
            for col_name in dtype.keys():
                if col_name not in self:
                    raise KeyError('Only a column name can be used for the '
                                   'key in a dtype mappings argument.')
            results = []
            for col_name, col in self.iteritems():
                if col_name in dtype:
                    results.append(col.astype(dtype[col_name], copy=copy))
                else:
                    results.append(results.append(col.copy() if copy else col))

Expected Output

One would expect the pd.DataFrame to successfully type cast, leaving the col_b as an np.object type

Metadata

Metadata

Assignees

No one assigned

    Labels

    DataFrameDataFrame data structureError ReportingIncorrect or improved errors from pandas

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions