Skip to content

pandas.DataFrame.replace raises UnboundLocalError on mixed data types #11698

Closed
@vladu

Description

@vladu

This is in 0.17.1. Suppose we have a frame with mixed data types. Suppose also we want to replace a string value with something else. If the frame has only string columns, or maybe string and int columns, this works fine. However, if the frame has string and datetime columns, this raises an exception. Example:

>>> pandas.DataFrame([('-', pandas.to_datetime('20150101')), ('a', pandas.to_datetime('20150102')), ('b', pandas.to_datetime('20150103'))], columns=['a', 'b']).replace('-', numpy.nan)
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-11-bce7dc78fc44> in <module>()
----> 1 pandas.DataFrame([('-', pandas.to_datetime('20150101')), ('a', pandas.to_datetime('20150102')), ('b', pandas.to_datetime('20150103'))], columns=['a', 'b']).replace('-', numpy.nan)

/.../pandas/core/generic.pyc in replace(self, to_replace, value, inplace, limit, regex, method, axis)
   3108                 elif not com.is_list_like(value):  # NA -> 0
   3109                     new_data = self._data.replace(to_replace=to_replace, value=value,
-> 3110                                                   inplace=inplace, regex=regex)
   3111                 else:
   3112                     msg = ('Invalid "to_replace" type: '

/.../pandas/core/internals.pyc in replace(self, **kwargs)
   2868
   2869     def replace(self, **kwargs):
-> 2870         return self.apply('replace', **kwargs)
   2871
   2872     def replace_list(self, src_list, dest_list, inplace=False, regex=False, mgr=None):

/.../pandas/core/internals.pyc in apply(self, f, axes, filter, do_integrity_check, consolidate, **kwargs)
   2821
   2822             kwargs['mgr'] = self
-> 2823             applied = getattr(b, f)(**kwargs)
   2824             result_blocks = _extend_blocks(applied, result_blocks)
   2825

/.../pandas/core/internals.pyc in replace(self, to_replace, value, inplace, filter, regex, convert, mgr)
    605
    606             # we can't process the value, but nothing to do
--> 607             if not mask.any():
    608                 return self if inplace else self.copy()
    609

UnboundLocalError: local variable 'mask' referenced before assignment

And the requisite show_versions:

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Linux
OS-release: 2.6.18-348.2.1.el5
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: C
LANG: en_US.UTF-8

pandas: 0.17.1
nose: 1.3.7
pip: 7.1.2
setuptools: 18.4
Cython: 0.23.4
numpy: 1.10.1
scipy: 0.16.0
statsmodels: 0.6.1
IPython: 4.0.0
sphinx: 1.3.1
patsy: 0.4.0
dateutil: 2.4.2
pytz: 2015.7
blosc: None
bottleneck: 1.0.0
tables: 3.1.0
numexpr: 2.4.4
matplotlib: 1.5.0
openpyxl: 2.2.6
xlrd: 0.9.4
xlwt: 1.0.0
xlsxwriter: 0.7.7
lxml: 3.4.4
bs4: 4.3.2
html5lib: 0.999
httplib2: None
apiclient: None
sqlalchemy: 1.0.9
pymysql: None
psycopg2: None
Jinja2: None

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugIndexingRelated to indexing on series/frames, not to indexes themselvesInternalsRelated to non-user accessible pandas implementationMissing-datanp.nan, pd.NaT, pd.NA, dropna, isnull, interpolate

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions