@@ -557,22 +557,9 @@ def __setitem__(self, key, value):
557
557
558
558
def __delitem__ (self , key ):
559
559
"""Remove a variable from this dataset.
560
-
561
- If this variable is a dimension, all variables containing this
562
- dimension are also removed.
563
560
"""
564
- def remove (k ):
565
- del self ._variables [k ]
566
- self ._coord_names .discard (k )
567
-
568
- remove (key )
569
-
570
- if key in self ._dims :
571
- del self ._dims [key ]
572
- also_delete = [k for k , v in iteritems (self ._variables )
573
- if key in v .dims ]
574
- for key in also_delete :
575
- remove (key )
561
+ del self ._variables [key ]
562
+ self ._coord_names .discard (key )
576
563
577
564
# mutable objects should not be hashable
578
565
__hash__ = None
@@ -1224,7 +1211,9 @@ def reindex(self, indexers=None, method=None, tolerance=None, copy=True, **kw_in
1224
1211
variables = alignment .reindex_variables (
1225
1212
self .variables , self .dims , self .indexes , indexers , method ,
1226
1213
tolerance , copy = copy )
1227
- return self ._replace_vars_and_dims (variables )
1214
+ coord_names = set (self ._coord_names )
1215
+ coord_names .update (indexers )
1216
+ return self ._replace_vars_and_dims (variables , coord_names )
1228
1217
1229
1218
def rename (self , name_dict , inplace = False ):
1230
1219
"""Returns a new object with renamed variables and dimensions.
@@ -1250,9 +1239,9 @@ def rename(self, name_dict, inplace=False):
1250
1239
DataArray.rename
1251
1240
"""
1252
1241
for k , v in name_dict .items ():
1253
- if k not in self :
1242
+ if k not in self and k not in self . dims :
1254
1243
raise ValueError ("cannot rename %r because it is not a "
1255
- "variable in this dataset" % k )
1244
+ "variable or dimension in this dataset" % k )
1256
1245
if v in self and k != v :
1257
1246
raise ValueError ('the new name %r already exists' % v )
1258
1247
@@ -1339,18 +1328,8 @@ def _stack_once(self, dims, new_dim):
1339
1328
else :
1340
1329
variables [name ] = var .copy (deep = False )
1341
1330
1342
- indexes = self .indexes
1343
- dim_sizes = self .dims
1344
-
1345
- levels = []
1346
- for dim in dims :
1347
- if dim in indexes :
1348
- level = indexes [dim ]
1349
- else :
1350
- level = np .arange (dim_sizes [dim ])
1351
- levels .append (level )
1352
-
1353
1331
# consider dropping levels that are unused?
1332
+ levels = [self .indexes .get (dim ) for dim in dims ]
1354
1333
idx = utils .multiindex_from_product_levels (levels , names = dims )
1355
1334
variables [new_dim ] = IndexVariable (new_dim , idx )
1356
1335
@@ -1409,7 +1388,7 @@ def unstack(self, dim):
1409
1388
if dim not in self .dims :
1410
1389
raise ValueError ('invalid dimension: %s' % dim )
1411
1390
1412
- index = self .indexes [ dim ]
1391
+ index = self .indexes . get ( dim )
1413
1392
if not isinstance (index , pd .MultiIndex ):
1414
1393
raise ValueError ('cannot unstack a dimension that does not have '
1415
1394
'a MultiIndex' )
@@ -1551,7 +1530,12 @@ def drop(self, labels, dim=None):
1551
1530
if dim is None :
1552
1531
return self ._drop_vars (labels )
1553
1532
else :
1554
- new_index = self .indexes [dim ].drop (labels )
1533
+ try :
1534
+ index = self .indexes [dim ]
1535
+ except KeyError :
1536
+ raise ValueError (
1537
+ 'dimension %r does not have coordinate labels' % dim )
1538
+ new_index = index .drop (labels )
1555
1539
return self .loc [{dim : new_index }]
1556
1540
1557
1541
def _drop_vars (self , names ):
0 commit comments