title: df.at with multiindex vs df.loc
body: <p>I have a question about the differences between <code>df.loc</code> and <code>df.at</code> with respect to dataframes with a MultiIndex.  I've been looking at a few wonderful resources from stackoverflow but it doesn't seem to shed on light on my issue.  This one in particular... <a href="https://stackoverflow.com/questions/37216485/pandas-at-versus-loc">pandas .at versus .loc</a> (or at least I do not fully understand what is being displayed here).  </p>
  
  <p>Per the pandas documentation, <a href="https://pandas-docs.github.io/pandas-docs-travis/generated/pandas.DataFrame.at.html" rel="noreferrer">https://pandas-docs.github.io/pandas-docs-travis/generated/pandas.DataFrame.at.html</a>, <code>df.at</code> is supposed to return singular values, and its faster than <code>df.loc</code>, so i'm inclined to want to use <code>df.at</code>.  Let me show my confusion as it applies to using <code>df.at</code> with a MultiIndex.</p>
  
  <p>I have the following dataframe:</p>
  
  <pre><code>df = pd.DataFrame({'field1':['foo']*6, 'field2':['bar']*6, 'field3': 
  ['a','a','b','b','b','c'],'value1':[0.4,0.5,0.4,0.7,.9,.4],'value2': 
  [4000,4000,9000,9000,9000,10000]}, index=range(6))
  
  df
  Out[329]: 
    field1 field2 field3  value1  value2
  0    foo    bar      a     0.4    4000
  1    foo    bar      a     0.5    4000
  2    foo    bar      b     0.4    9000
  3    foo    bar      b     0.7    9000
  4    foo    bar      b     0.9    9000
  5    foo    bar      c     0.4   10000
  </code></pre>
  
  <p>I'd like to access this dataframe using a MultiIndex, so I'm doing the following:</p>
  
  <pre><code>df = df.set_index(['field1','field2','field3'])
  </code></pre>
  
  <p>So now I'd like to access <code>value1</code> in my <code>df</code> at <code>('foo','bar','c')</code> which is a singular value, and it errors.</p>
  
  <pre><code>df.at[('foo','bar','c'),'value1']
  Traceback (most recent call last):
  
    File "&lt;ipython-input-344-921b8b658a49&gt;", line 1, in &lt;module&gt;
      df.at[('foo','bar','c'),'value1']
  
    File "C:\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 1610, 
  in __getitem__
      return self.obj.get_value(*key, takeable=self._takeable)
  
    File "C:\Anaconda2\lib\site-packages\pandas\core\frame.py", line 1836, in 
  get_value
      return engine.get_value(series.get_values(), index)
  
    File "pandas\index.pyx", line 103, in pandas.index.IndexEngine.get_value 
  (pandas\index.c:3234)
  
    File "pandas\index.pyx", line 111, in pandas.index.IndexEngine.get_value 
  (pandas\index.c:2931)
  
    File "pandas\index.pyx", line 152, in pandas.index.IndexEngine.get_loc 
  (pandas\index.c:3830)
  
    File "pandas\index.pyx", line 170, in 
  pandas.index.IndexEngine._get_loc_duplicates (pandas\index.c:4154)
  
  TypeError: only integer arrays with one element can be converted to an index
  </code></pre>
  
  <p>I'm assuming this is returning a series object, which cannot be expressed a single value?  That is just my assumption given the output with <code>df.loc</code>.</p>
  
  <pre><code>df.loc[('foo','bar','c')]['value1']
   Out[345]: 
  field1  field2  field3
  foo     bar     c         0.4
  Name: value1, dtype: float64
  </code></pre>
  
  <p>Now if I wasn't using a MultiIndex, I assume this issue does not arise...</p>
  
  <p>Is there anyway around this, or I am clearly missing something?  Thank you</p>