diff --git a/doc/source/whatsnew/v0.20.0.txt b/doc/source/whatsnew/v0.20.0.txt index aeafc76876bbd..4d12d32084bf4 100644 --- a/doc/source/whatsnew/v0.20.0.txt +++ b/doc/source/whatsnew/v0.20.0.txt @@ -109,3 +109,5 @@ Performance Improvements Bug Fixes ~~~~~~~~~ + +- Bug in ``DataFrame(..).apply(to_numeric)`` when values are of type decimal.Decimal. (:issue:`14827`) diff --git a/pandas/tools/tests/test_util.py b/pandas/tools/tests/test_util.py index f9647721e3c5b..dca40e7812764 100644 --- a/pandas/tools/tests/test_util.py +++ b/pandas/tools/tests/test_util.py @@ -2,6 +2,7 @@ import locale import codecs import nose +import decimal import numpy as np from numpy import iinfo @@ -208,6 +209,16 @@ def test_numeric(self): res = to_numeric(s) tm.assert_series_equal(res, expected) + # GH 14827 + df = pd.DataFrame(dict( + a=[1.2, decimal.Decimal(3.14), decimal.Decimal("infinity"), '0.1'] + )) + df['a'] = df['a'].apply(to_numeric) + expected = pd.DataFrame(dict( + a=[1.2, 3.14, np.inf, 0.1] + )) + tm.assert_frame_equal(df, expected) + def test_all_nan(self): s = pd.Series(['a', 'b', 'c']) res = to_numeric(s, errors='coerce') diff --git a/pandas/tools/util.py b/pandas/tools/util.py index b50bf9dc448bc..84f21c01ab312 100644 --- a/pandas/tools/util.py +++ b/pandas/tools/util.py @@ -1,3 +1,4 @@ +from decimal import Decimal import numpy as np import pandas.lib as lib @@ -173,6 +174,8 @@ def to_numeric(arg, errors='raise', downcast=None): values = arg.values elif isinstance(arg, (list, tuple)): values = np.array(arg, dtype='O') + elif isinstance(arg, Decimal): + return float(arg) elif np.isscalar(arg): if is_number(arg): return arg