@@ -1252,7 +1252,7 @@ def _sort_levels_monotonic(self):
1252
1252
names = self .names , sortorder = self .sortorder ,
1253
1253
verify_integrity = False )
1254
1254
1255
- def remove_unused_levels (self ):
1255
+ def remove_unused_levels (self , inplace = False ):
1256
1256
"""
1257
1257
create a new MultiIndex from the current that removing
1258
1258
unused levels, meaning that they are not expressed in the labels
@@ -1263,6 +1263,11 @@ def remove_unused_levels(self):
1263
1263
1264
1264
.. versionadded:: 0.20.0
1265
1265
1266
+ Parameters
1267
+ ----------
1268
+ inplace : bool
1269
+ if True, mutates in place
1270
+
1266
1271
Returns
1267
1272
-------
1268
1273
MultiIndex
@@ -1290,42 +1295,42 @@ def remove_unused_levels(self):
1290
1295
new_levels = []
1291
1296
new_labels = []
1292
1297
1293
- changed = np . ones ( self . nlevels , dtype = bool )
1294
- for i , ( lev , lab ) in enumerate ( zip (self .levels , self .labels ) ):
1298
+ changed = False
1299
+ for lev , lab in zip (self .levels , self .labels ):
1295
1300
1296
1301
uniques = algos .unique (lab )
1297
1302
1298
1303
# nothing unused
1299
1304
if len (uniques ) == len (lev ):
1300
1305
new_levels .append (lev )
1301
1306
new_labels .append (lab )
1302
- changed [i ] = False
1303
1307
continue
1304
1308
1305
- # set difference, then reverse sort
1306
- diff = Index (np .arange (len (lev ))).difference (uniques )
1307
- unused = diff .sort_values (ascending = False )
1309
+ changed = True
1310
+
1311
+ # labels get mapped from uniques to 0:len(uniques)
1312
+ label_mapping = np .zeros (len (lev ))
1313
+ label_mapping [uniques ] = np .arange (len (uniques ))
1314
+ lab = label_mapping [lab ]
1308
1315
1309
1316
# new levels are simple
1310
1317
lev = lev .take (uniques )
1311
1318
1312
- # new labels, we remove the unsued
1313
- # by decrementing the labels for that value
1314
- # prob a better way
1315
- for u in unused :
1316
-
1317
- lab = np .where (lab > u , lab - 1 , lab )
1318
-
1319
1319
new_levels .append (lev )
1320
1320
new_labels .append (lab )
1321
+
1322
+ if inplace :
1323
+ idx = self
1324
+ else :
1325
+ idx = self ._shallow_copy ()
1321
1326
1322
- # nothing changed
1323
- if not changed .any ():
1324
- return self
1327
+ if changed :
1328
+ idx ._reset_identity ()
1329
+ idx ._set_levels (new_levels , validate = False )
1330
+ idx ._set_labels (new_labels , validate = False )
1325
1331
1326
- return MultiIndex (new_levels , new_labels ,
1327
- names = self .names , sortorder = self .sortorder ,
1328
- verify_integrity = False )
1332
+ if not inplace :
1333
+ return idx
1329
1334
1330
1335
@property
1331
1336
def nlevels (self ):
0 commit comments