在pandas中使用多级索引时,如何使用.loc函数?

76
有人知道是否可以使用 DataFrame.loc 方法从 MultiIndex 中进行选择吗?我有以下的 DataFrame,希望能够访问位于索引 ('at', 1)('at', 3)('at', 5) 等位置上的 Dwell 列的值(非连续的)。
我希望能够像在普通索引中使用 data.loc[[1,3,5], 'Dwell'] 语法一样,使用 data.loc[['at',[1,3,5]], 'Dwell'] 来实现此功能(返回一个包含 3 个 Dwell 值的系列)。
我的目的是选择数据的任意子集,在该子集上执行某些分析,然后使用分析结果更新新值。我计划使用相同的语法为这些数据设置新值,因此在这种情况下,链接选择器并不适用。
这是我正在处理的 DataFrame 的一部分:
         Char    Dwell  Flight  ND_Offset  Offset
QGram                                                           
at    0     a      100     120   0.000000       0  
      1     t      180       0   0.108363       5  
      2     a      100     120   0.000000       0 
      3     t      180       0   0.108363       5 
      4     a       20     180   0.000000       0  
      5     t       80     120   0.108363       5
      6     a       20     180   0.000000       0   
      7     t       80     120   0.108363       5  
      8     a       20     180   0.000000       0  
      9     t       80     120   0.108363       5   
      10    a      120     180   0.000000       0  
5个回答

72

如果您使用的是版本0.14,您可以像下面这样简单地将一个元组传递给.loc

df.loc[('at', [1,3,4]), 'Dwell']

7
很有趣,因为如果你传递一个列表而不是元组,它就不能正常工作。 - leoschet
6
Pandas将元组条目解释为层级,将列表条目解释为级别中的项。 https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html#advanced-indexing-with-hierarchical-index FYI - D.J.Duff

18
尝试使用层次索引的交叉切片索引:

请点击此链接了解更多信息。

In [68]: df.xs('at', level='QGram', drop_level=False).loc[[1,4]]
Out[68]: 
        Char  Dwell  Flight  ND_Offset  Offset
QGram                                         
at    1    t    180       0   0.108363       5
      4    a     20     180   0.000000       0

这是pandas文档推荐的方式,因为使用xs可以进行深度索引切片:http://pandas-docs.github.io/pandas-docs-travis/user_guide/advanced.html#advanced-xs - physincubus
6
xs 仍然推荐使用吗? - baxx
1
@baxx。是的,xs仍然被推荐使用。请参见https://pandas.pydata.org/pandas-docs/dev/user_guide/advanced.html#cross-section - amball

4

.loc在多级索引中是您最好的朋友。但是,在多级索引上使用loc时,您必须了解其工作原理。当在多级索引上使用loc时,您必须在loc中指定其他每个索引值,例如:

     df.loc['indexValue1','indexValue2','indexValue3']

然而,正如你所想象的那样,在你不知道所有其他值的情况下,这可能会很麻烦,因此我们当然可以使用“:”。

      df.loc[:,'value1','value2',:]

希望这可以帮到你!

这对于pandas 0.24不起作用。 - giorgiosegalla

3

通常,MultiIndex键的形式为元组。例如:

In [6]: df.loc[('at', 1),'Dwell']
Out[6]: 180

在您的情况下,您需要传递一个元组列表。例如,以下内容按预期工作:

In [7]: df.loc[ [('at', 1),('at', 3),('at', 5)], 'Dwell']
Out[7]:
          Dwell
QGram                                                           
at    1    180
at    3    180 
at    5     80  

更多信息可以在这里找到:https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html - Marioanzas

0

我曾经遇到过同样的问题。

df[('colindex1','colindex2')][('rowindex1','rowindex2', 'rowindex3')]:没有问题

df.loc[('rowindex1','rowindex2', 'rowindex3')],[('colindex1','colindex2')]:会出现以下错误信息: KeyError: "None of [Index(['rowindex1','rowindex2', \n 'rowindex3'], \n dtype='object')] are in the [index]"

我尝试将我的索引元组放入列表中,结果是可以的:

    df.loc[[('rowindex1','rowindex2', 'rowindex3')],[('colindex1','colindex2')]]

我不知道为什么,也许是因为一些未显示的"\n"被添加到了索引中?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接