@@ -60,16 +60,18 @@ def __new__(cls, data=None, categories=None, ordered=None, dtype=None,
60
60
copy = False , name = None , fastpath = False , ** kwargs ):
61
61
62
62
if fastpath :
63
- return cls ._simple_new (data , name = name )
63
+ return cls ._simple_new (data , name = name , dtype = dtype )
64
64
65
65
if name is None and hasattr (data , 'name' ):
66
66
name = data .name
67
67
68
68
if isinstance (data , ABCCategorical ):
69
- data = cls ._create_categorical (cls , data , categories , ordered )
69
+ data = cls ._create_categorical (cls , data , categories , ordered ,
70
+ dtype )
70
71
elif isinstance (data , CategoricalIndex ):
71
72
data = data ._data
72
- data = cls ._create_categorical (cls , data , categories , ordered )
73
+ data = cls ._create_categorical (cls , data , categories , ordered ,
74
+ dtype )
73
75
else :
74
76
75
77
# don't allow scalars
@@ -116,7 +118,8 @@ def _create_from_codes(self, codes, categories=None, ordered=None,
116
118
return CategoricalIndex (cat , name = name )
117
119
118
120
@staticmethod
119
- def _create_categorical (self , data , categories = None , ordered = None ):
121
+ def _create_categorical (self , data , categories = None , ordered = None ,
122
+ dtype = None ):
120
123
"""
121
124
*this is an internal non-public method*
122
125
@@ -127,28 +130,34 @@ def _create_categorical(self, data, categories=None, ordered=None):
127
130
data : data for new Categorical
128
131
categories : optional categories, defaults to existing
129
132
ordered : optional ordered attribute, defaults to existing
133
+ dtype : CategoricalDtype, defaults to existing
130
134
131
135
Returns
132
136
-------
133
137
Categorical
134
138
"""
135
139
if not isinstance (data , ABCCategorical ):
136
- ordered = False if ordered is None else ordered
140
+ if ordered is None and dtype is None :
141
+ ordered = False
137
142
from pandas .core .categorical import Categorical
138
- data = Categorical (data , categories = categories , ordered = ordered )
143
+ data = Categorical (data , categories = categories , ordered = ordered ,
144
+ dtype = dtype )
139
145
else :
140
146
if categories is not None :
141
- data = data .set_categories (categories )
142
- if ordered is not None :
147
+ data = data .set_categories (categories , ordered = ordered )
148
+ elif ordered is not None and ordered != data . ordered :
143
149
data = data .set_ordered (ordered )
150
+ elif dtype is not None :
151
+ data = data ._set_dtype (dtype )
144
152
return data
145
153
146
154
@classmethod
147
155
def _simple_new (cls , values , name = None , categories = None , ordered = None ,
148
- ** kwargs ):
156
+ dtype = None , ** kwargs ):
149
157
result = object .__new__ (cls )
150
158
151
- values = cls ._create_categorical (cls , values , categories , ordered )
159
+ values = cls ._create_categorical (cls , values , categories , ordered ,
160
+ dtype = dtype )
152
161
result ._data = values
153
162
result .name = name
154
163
for k , v in compat .iteritems (kwargs ):
@@ -162,15 +171,24 @@ def _shallow_copy(self, values=None, categories=None, ordered=None,
162
171
dtype = None , ** kwargs ):
163
172
# categories and ordered can't be part of attributes,
164
173
# as these are properties
174
+ # we want to reuse self.dtype if possible, i.e. neither are
175
+ # overridden.
176
+ if dtype is not None and (categories is not None or
177
+ ordered is not None ):
178
+ raise TypeError
179
+
180
+ if categories is None and ordered is None :
181
+ dtype = self .dtype if dtype is None else dtype
182
+ return super (CategoricalIndex , self )._shallow_copy (
183
+ values = values , dtype = dtype , ** kwargs )
165
184
if categories is None :
166
185
categories = self .categories
167
186
if ordered is None :
168
187
ordered = self .ordered
169
- if dtype is None :
170
- dtype = self .dtype
188
+
171
189
return super (CategoricalIndex , self )._shallow_copy (
172
190
values = values , categories = categories ,
173
- ordered = ordered , dtype = dtype , ** kwargs )
191
+ ordered = ordered , ** kwargs )
174
192
175
193
def _is_dtype_compat (self , other ):
176
194
"""
0 commit comments