在pandas中使用.loc和MultiIndex?

kro*_*ens 30 python multi-index dataframe pandas

有谁知道是否可以使用DataFrame.loc方法从MultiIndex中进行选择?我有以下的数据帧,并希望能够访问位于"暂停"列中的值,在指数('at', 1),('at', 3),('at', 5),等(非连续).

我希望能够做data.loc[['at',[1,3,5]], 'Dwell']类似于data.loc[[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  
Run Code Online (Sandbox Code Playgroud)

谢谢!

chr*_*isb 39

如果您使用的是版本0.14,则只需将元组传递给.loc如下所示:

df.loc[('at', [1,3,4]), 'Dwell']
Run Code Online (Sandbox Code Playgroud)

  • @leoschet Pandas 将元组条目解释为级别,并将列表条目解释为级别中的项目。https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html#advanced-indexing-with-hierarchical-index仅供参考 (5认同)
  • 有趣的是,如果您通过一个列表而不是一个元组,它将无法正常工作 (3认同)

Rol*_*Max 13

尝试横截面索引:

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
Run Code Online (Sandbox Code Playgroud)

  • 还推荐“xs”吗? (6认同)

小智 6

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

df.loc['indexValue1', 'indexValue2', 'indexValue3']
Run Code Online (Sandbox Code Playgroud)

然而,正如您可能想象的那样,如果您不知道所有其他值是什么,这可能会很痛苦,所以我们当然可以使用“:”

df.loc[:, 'value1', 'value2', :]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!