在 Pandas 中使用 .loc 和 MultiIndex

Posted

技术标签:

【中文标题】在 Pandas 中使用 .loc 和 MultiIndex【英文标题】:Using .loc with a MultiIndex in pandas 【发布时间】:2014-08-17 14:48:47 【问题描述】:

有谁知道是否可以使用DataFrame.loc 方法从MultiIndex 中进行选择?我有以下DataFrame 并希望能够访问位于Dwell 列中的值,位于('at', 1)('at', 3)('at', 5) 等索引处(非顺序)。

我希望能够执行类似data.loc[['at',[1,3,5]], 'Dwell'] 的操作,类似于常规索引的data.loc[[1,3,5], 'Dwell'] 语法(返回由Dwell 值组成的3 成员系列)。

我的目的是选择数据的任意子集,仅对该子集执行一些分析,然后使用分析结果更新新值。我计划使用相同的语法为这些数据设置新值,因此在这种情况下链接选择器不会真正起作用。

这是我正在使用的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  

【问题讨论】:

【参考方案1】:

试试cross-section 索引:

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 进行深度索引切片:pandas-docs.github.io/pandas-docs-travis/user_guide/… 还推荐xs吗? @baxx。是的,仍然推荐xs。见pandas.pydata.org/pandas-docs/dev/user_guide/…【参考方案2】:

如果您使用的是 0.14 版本,您可以简单地将一个元组传递给 .loc,如下所示:

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

【讨论】:

很有趣,因为如果你传递一个列表而不是一个元组,它就不能正常工作 @leoschet Pandas 将元组条目解释为级别,并将条目列表解释为级别中的项目。 pandas.pydata.org/pandas-docs/stable/user_guide/…仅供参考【参考方案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  

【讨论】:

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

以上是关于在 Pandas 中使用 .loc 和 MultiIndex的主要内容,如果未能解决你的问题,请参考以下文章

在pandas中使用query替代loc进行高效简洁的条件筛选

在pandas中使用query替代loc进行高效简洁的条件筛选

在pandas中使用query替代loc进行高效简洁的条件筛选

Python pandas.DataFrame.loc函数方法的使用

如何在 Pandas 或 Python 中根据某些条件放置项目?

快速学会pandas中Dataframe索引.ix,.iloc,.loc的使用以及区别