Python df.at与多索引vs df.loc

Python df.at与多索引vs df.loc,python,pandas,dataframe,Python,Pandas,Dataframe,关于带有多索引的数据帧,df.loc和df.at之间的差异,我有一个问题。我一直在从stackoverflow中寻找一些非常好的资源,但它似乎没有阐明我的问题。特别是这个。。。(或者至少我不完全理解这里展示的内容) 根据pandas文档,df.at应该返回奇异值,并且比df.loc快,因此我倾向于使用df.at。让我展示一下我的困惑,因为它适用于将df.at与多索引一起使用 我有以下数据帧: df = pd.DataFrame({'field1':['foo']*6, 'field2':['ba

关于带有多索引的数据帧,
df.loc
df.at
之间的差异,我有一个问题。我一直在从stackoverflow中寻找一些非常好的资源,但它似乎没有阐明我的问题。特别是这个。。。(或者至少我不完全理解这里展示的内容)

根据pandas文档,
df.at
应该返回奇异值,并且比
df.loc
快,因此我倾向于使用
df.at
。让我展示一下我的困惑,因为它适用于将
df.at
与多索引一起使用

我有以下数据帧:

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
我希望使用多索引访问此数据帧,因此我将执行以下操作:

df = df.set_index(['field1','field2','field3'])
现在我想访问
中的
value1
中('foo','bar','c')
这是一个单数值,它会出错

df.at[('foo','bar','c'),'value1']
Traceback (most recent call last):

  File "<ipython-input-344-921b8b658a49>", line 1, in <module>
    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
现在如果我没有使用多索引,我假设这个问题不会出现


这是真的吗,还是我明显遗漏了什么?谢谢你

你可以试试这样的东西:

# setting multiindex
df = df.set_index(['field1','field2','field3'])
现在,当您像这样使用
df.at
时:
df.at[('foo','bar','c')]['value1']
,您将得到所需的结果:

field1  field2  field3
foo     bar     c         0.4
Name: value1, dtype: float64

根据我的尝试,您可能没有正确地使用
at
查询数据帧。

这是一个写得很好的问题。我无法用Pandas 0.22重现这个问题。有趣的是,
df.at[('foo','bar','a'),'value1']
返回
数组([0.4,0.5])
.Hmmm。我使用的是熊猫0.18,也许这已经被修复了?在0.22中不能重复第二次。
field1  field2  field3
foo     bar     c         0.4
Name: value1, dtype: float64