title: indexing on unindexed coordinate, with dimensions corresponding to an indexed coordinate?
body: <p>Suppose I have several coordinates with the same dimensions, such as in the example below:</p>
  
  <pre><code>In [46]: ds = xarray.Dataset({"x": (("a", "b"), arange(25).reshape(5,5)+100), "y": ("b", arange(5)-100)}, {"a": arange(5), "b": arange(5)*2, "c": (("a",), list("ABCDE"))})
  
  In [47]: print(ds)
  &lt;xarray.Dataset&gt;
  Dimensions:  (a: 5, b: 5)
  Coordinates:
    * b        (b) int64 0 2 4 6 8
      c        (a) &lt;U1 'A' 'B' 'C' 'D' 'E'
    * a        (a) int64 0 1 2 3 4
  Data variables:
      x        (a, b) int64 100 101 102 103 104 105 106 107 108 109 110 111 ...
      y        (b) int64 -100 -99 -98 -97 -96
  </code></pre>
  
  <p>Coordinate <code>a</code> is recognised as in index (I guess by name), but coordinate <code>c</code> is not.  I can index using coordinate <code>a</code>:</p>
  
  <pre><code>In [48]: print(ds.loc[dict(a=slice(0, 2))])
  &lt;xarray.Dataset&gt;
  Dimensions:  (a: 3, b: 5)
  Coordinates:
    * b        (b) int64 0 2 4 6 8
      c        (a) &lt;U1 'A' 'B' 'C'
    * a        (a) int64 0 1 2
  Data variables:
      x        (a, b) int64 100 101 102 103 104 105 106 107 108 109 110 111 ...
      y        (b) int64 -100 -99 -98 -97 -96
  </code></pre>
  
  <p>But I cannot index using coordinate <code>c</code>: </p>
  
  <pre><code>In [49]: print(ds.loc[dict(c=slice("A", "C"))])
  ---------------------------------------------------------------------------
  ValueError                                Traceback (most recent call last)
  &lt;ipython-input-49-33483295fec4&gt; in &lt;module&gt;()
  ----&gt; 1 print(ds.loc[dict(c=slice("A", "C"))])
  
  /dev/shm/gerrit/venv/stable-3.5/lib/python3.5/site-packages/xarray/core/dataset.py in __getitem__(self, key)
      292         if not utils.is_dict_like(key):
      293             raise TypeError('can only lookup dictionaries from Dataset.loc')
  --&gt; 294         return self.dataset.sel(**key)
      295 
      296 
  
  /dev/shm/gerrit/venv/stable-3.5/lib/python3.5/site-packages/xarray/core/dataset.py in sel(self, method, tolerance, drop, **indexers)
     1180         """
     1181         pos_indexers, new_indexes = indexing.remap_label_indexers(
  -&gt; 1182             self, indexers, method=method, tolerance=tolerance
     1183         )
     1184         result = self.isel(drop=drop, **pos_indexers)
  
  /dev/shm/gerrit/venv/stable-3.5/lib/python3.5/site-packages/xarray/core/indexing.py in remap_label_indexers(data_obj, indexers, method, tolerance)
      273     new_indexes = {}
      274 
  --&gt; 275     dim_indexers = get_dim_indexers(data_obj, indexers)
      276     for dim, label in iteritems(dim_indexers):
      277         try:
  
  /dev/shm/gerrit/venv/stable-3.5/lib/python3.5/site-packages/xarray/core/indexing.py in get_dim_indexers(data_obj, indexers)
      241     if invalid:
      242         raise ValueError("dimensions or multi-index levels %r do not exist"
  --&gt; 243                          % invalid)
      244 
      245     level_indexers = defaultdict(dict)
  
  ValueError: dimensions or multi-index levels ['c'] do not exist
  </code></pre>
  
  <p>Of course, I can pass a boolean array on from <code>c</code> to <code>a</code>,</p>
  
  <pre><code>In [61]: ds.loc[dict(a=((ds.c&gt;='A') &amp; (ds.c&lt;='C')))]
  Out[61]: 
  &lt;xarray.Dataset&gt;
  Dimensions:  (a: 3, b: 5)
  Coordinates:
    * b        (b) int64 0 2 4 6 8
      c        (a) &lt;U1 'A' 'B' 'C'
    * a        (a) int64 0 1 2
  Data variables:
      x        (a, b) int64 100 101 102 103 104 105 106 107 108 109 110 111 ...
      y        (b) int64 -100 -99 -98 -97 -96
  </code></pre>
  
  <p>or use the <code>where</code> method (although this has a side-effect on making <code>ds['y']</code> larger (?),</p>
  
  <pre><code>In [57]: ds.where((ds.c&gt;='A') &amp; (ds.c&lt;='C'), drop=True)
  Out[57]: 
  &lt;xarray.Dataset&gt;
  Dimensions:  (a: 3, b: 5)
  Coordinates:
    * b        (b) int64 0 2 4 6 8
      c        (a) &lt;U1 'A' 'B' 'C'
    * a        (a) int64 0 1 2
  Data variables:
      x        (a, b) float64 100.0 101.0 102.0 103.0 104.0 105.0 106.0 107.0 ...
      y        (b, a) float64 -100.0 -100.0 -100.0 -99.0 -99.0 -99.0 -98.0 ...
  </code></pre>
  
  <p>but both cases work with any data variable.  Is there a practical difference between unindexed coordinates and data variables?  Can I use <code>c</code>s status as a coordinate for indexing, or do I need to resort to the roundabout way as I would for a data variable?</p>