@@ -328,11 +328,16 @@ def __init__(self, values, categories=None, ordered=False,
328
328
self ._categories = categories
329
329
self ._codes = _coerce_indexer_dtype (codes , categories )
330
330
331
+ @property
332
+ def _constructor (self ):
333
+ return Categorical
334
+
331
335
def copy (self ):
332
336
""" Copy constructor. """
333
- return Categorical (values = self ._codes .copy (),
334
- categories = self .categories , ordered = self .ordered ,
335
- fastpath = True )
337
+ return self ._constructor (values = self ._codes .copy (),
338
+ categories = self .categories ,
339
+ ordered = self .ordered ,
340
+ fastpath = True )
336
341
337
342
def astype (self , dtype , copy = True ):
338
343
"""
@@ -414,7 +419,7 @@ def from_array(cls, data, **kwargs):
414
419
Can be an Index or array-like. The categories are assumed to be
415
420
the unique values of `data`.
416
421
"""
417
- return Categorical (data , ** kwargs )
422
+ return cls (data , ** kwargs )
418
423
419
424
@classmethod
420
425
def from_codes (cls , codes , categories , ordered = False , name = None ):
@@ -458,8 +463,8 @@ def from_codes(cls, codes, categories, ordered=False, name=None):
458
463
raise ValueError ("codes need to be between -1 and "
459
464
"len(categories)-1" )
460
465
461
- return Categorical (codes , categories = categories , ordered = ordered ,
462
- fastpath = True )
466
+ return cls (codes , categories = categories , ordered = ordered ,
467
+ fastpath = True )
463
468
464
469
_codes = None
465
470
@@ -916,9 +921,9 @@ def map(self, mapper):
916
921
"""
917
922
new_categories = self .categories .map (mapper )
918
923
try :
919
- return Categorical .from_codes (self ._codes .copy (),
920
- categories = new_categories ,
921
- ordered = self .ordered )
924
+ return self .from_codes (self ._codes .copy (),
925
+ categories = new_categories ,
926
+ ordered = self .ordered )
922
927
except ValueError :
923
928
return np .take (new_categories , self ._codes )
924
929
@@ -968,8 +973,8 @@ def shift(self, periods):
968
973
else :
969
974
codes [periods :] = - 1
970
975
971
- return Categorical .from_codes (codes , categories = self .categories ,
972
- ordered = self .ordered )
976
+ return self .from_codes (codes , categories = self .categories ,
977
+ ordered = self .ordered )
973
978
974
979
def __array__ (self , dtype = None ):
975
980
"""
@@ -1159,8 +1164,8 @@ def value_counts(self, dropna=True):
1159
1164
count = bincount (np .where (mask , code , ncat ))
1160
1165
ix = np .append (ix , - 1 )
1161
1166
1162
- ix = Categorical (ix , categories = cat , ordered = obj .ordered ,
1163
- fastpath = True )
1167
+ ix = self . _constructor (ix , categories = cat , ordered = obj .ordered ,
1168
+ fastpath = True )
1164
1169
1165
1170
return Series (count , index = CategoricalIndex (ix ), dtype = 'int64' )
1166
1171
@@ -1313,8 +1318,8 @@ def sort_values(self, inplace=False, ascending=True, na_position='last'):
1313
1318
self ._codes = codes
1314
1319
return
1315
1320
else :
1316
- return Categorical (values = codes , categories = self .categories ,
1317
- ordered = self .ordered , fastpath = True )
1321
+ return self . _constructor (values = codes , categories = self .categories ,
1322
+ ordered = self .ordered , fastpath = True )
1318
1323
1319
1324
def order (self , inplace = False , ascending = True , na_position = 'last' ):
1320
1325
"""
@@ -1441,8 +1446,8 @@ def fillna(self, value=None, method=None, limit=None):
1441
1446
values = values .copy ()
1442
1447
values [mask ] = self .categories .get_loc (value )
1443
1448
1444
- return Categorical (values , categories = self .categories ,
1445
- ordered = self .ordered , fastpath = True )
1449
+ return self . _constructor (values , categories = self .categories ,
1450
+ ordered = self .ordered , fastpath = True )
1446
1451
1447
1452
def take_nd (self , indexer , allow_fill = True , fill_value = None ):
1448
1453
""" Take the codes by the indexer, fill with the fill_value.
@@ -1455,8 +1460,8 @@ def take_nd(self, indexer, allow_fill=True, fill_value=None):
1455
1460
assert isnull (fill_value )
1456
1461
1457
1462
codes = take_1d (self ._codes , indexer , allow_fill = True , fill_value = - 1 )
1458
- result = Categorical (codes , categories = self .categories ,
1459
- ordered = self .ordered , fastpath = True )
1463
+ result = self . _constructor (codes , categories = self .categories ,
1464
+ ordered = self .ordered , fastpath = True )
1460
1465
return result
1461
1466
1462
1467
take = take_nd
@@ -1476,8 +1481,8 @@ def _slice(self, slicer):
1476
1481
slicer = slicer [1 ]
1477
1482
1478
1483
_codes = self ._codes [slicer ]
1479
- return Categorical (values = _codes , categories = self .categories ,
1480
- ordered = self .ordered , fastpath = True )
1484
+ return self . _constructor (values = _codes , categories = self .categories ,
1485
+ ordered = self .ordered , fastpath = True )
1481
1486
1482
1487
def __len__ (self ):
1483
1488
"""The length of this Categorical."""
@@ -1588,10 +1593,9 @@ def __getitem__(self, key):
1588
1593
else :
1589
1594
return self .categories [i ]
1590
1595
else :
1591
- return Categorical (values = self ._codes [key ],
1592
- categories = self .categories ,
1593
- ordered = self .ordered ,
1594
- fastpath = True )
1596
+ return self ._constructor (values = self ._codes [key ],
1597
+ categories = self .categories ,
1598
+ ordered = self .ordered , fastpath = True )
1595
1599
1596
1600
def __setitem__ (self , key , value ):
1597
1601
""" Item assignment.
@@ -1742,8 +1746,8 @@ def mode(self):
1742
1746
import pandas .hashtable as htable
1743
1747
good = self ._codes != - 1
1744
1748
values = sorted (htable .mode_int64 (_ensure_int64 (self ._codes [good ])))
1745
- result = Categorical (values = values , categories = self .categories ,
1746
- ordered = self .ordered , fastpath = True )
1749
+ result = self . _constructor (values = values , categories = self .categories ,
1750
+ ordered = self .ordered , fastpath = True )
1747
1751
return result
1748
1752
1749
1753
def unique (self ):
@@ -1837,8 +1841,8 @@ def repeat(self, repeats, *args, **kwargs):
1837
1841
"""
1838
1842
nv .validate_repeat (args , kwargs )
1839
1843
codes = self ._codes .repeat (repeats )
1840
- return Categorical (values = codes , categories = self .categories ,
1841
- ordered = self .ordered , fastpath = True )
1844
+ return self . _constructor (values = codes , categories = self .categories ,
1845
+ ordered = self .ordered , fastpath = True )
1842
1846
1843
1847
# The Series.cat accessor
1844
1848
0 commit comments