Skip to content

Commit 6565591

Browse files
committed
Merge pull request #8975 from jreback/infer
COMPAT: infer_dtype not handling categoricals (GH8974)
2 parents dd670e1 + 7e21403 commit 6565591

File tree

2 files changed

+53
-9
lines changed

2 files changed

+53
-9
lines changed

pandas/src/inference.pyx

+35-9
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ def is_period(object val):
2121
return util.is_period_object(val)
2222

2323
_TYPE_MAP = {
24+
'categorical' : 'categorical',
25+
'category' : 'categorical',
2426
'int8': 'integer',
2527
'int16': 'integer',
2628
'int32': 'integer',
@@ -65,29 +67,53 @@ try:
6567
except AttributeError:
6668
pass
6769

70+
cdef _try_infer_map(v):
71+
""" if its in our map, just return the dtype """
72+
cdef:
73+
object val_name, val_kind
74+
val_name = v.dtype.name
75+
if val_name in _TYPE_MAP:
76+
return _TYPE_MAP[val_name]
77+
val_kind = v.dtype.kind
78+
if val_kind in _TYPE_MAP:
79+
return _TYPE_MAP[val_kind]
80+
return None
81+
6882
def infer_dtype(object _values):
83+
"""
84+
we are coercing to an ndarray here
85+
"""
86+
6987
cdef:
7088
Py_ssize_t i, n
7189
object val
7290
ndarray values
7391

7492
if isinstance(_values, np.ndarray):
7593
values = _values
76-
elif hasattr(_values,'values'):
77-
values = _values.values
94+
elif hasattr(_values,'dtype'):
95+
96+
# this will handle ndarray-like
97+
# e.g. categoricals
98+
try:
99+
values = getattr(_values, 'values', _values)
100+
except:
101+
val = _try_infer_map(_values)
102+
if val is not None:
103+
return val
104+
105+
# its ndarray like but we can't handle
106+
raise ValueError("cannot infer type for {0}".format(type(_values)))
107+
78108
else:
79109
if not isinstance(_values, list):
80110
_values = list(_values)
81111
values = list_to_object_array(_values)
82112

83113
values = getattr(values, 'values', values)
84-
85-
val_name = values.dtype.name
86-
if val_name in _TYPE_MAP:
87-
return _TYPE_MAP[val_name]
88-
val_kind = values.dtype.kind
89-
if val_kind in _TYPE_MAP:
90-
return _TYPE_MAP[val_kind]
114+
val = _try_infer_map(values)
115+
if val is not None:
116+
return val
91117

92118
if values.dtype != np.object_:
93119
values = values.astype('O')

pandas/tests/test_tseries.py

+18
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,24 @@ def test_object(self):
660660
result = lib.infer_dtype(arr)
661661
self.assertEqual(result, 'mixed')
662662

663+
def test_categorical(self):
664+
665+
# GH 8974
666+
from pandas import Categorical, Series
667+
arr = Categorical(list('abc'))
668+
result = lib.infer_dtype(arr)
669+
self.assertEqual(result, 'categorical')
670+
671+
result = lib.infer_dtype(Series(arr))
672+
self.assertEqual(result, 'categorical')
673+
674+
arr = Categorical(list('abc'),categories=['cegfab'],ordered=True)
675+
result = lib.infer_dtype(arr)
676+
self.assertEqual(result, 'categorical')
677+
678+
result = lib.infer_dtype(Series(arr))
679+
self.assertEqual(result, 'categorical')
680+
663681
class TestMoments(tm.TestCase):
664682
pass
665683

0 commit comments

Comments
 (0)