【问题标题】:Using .loc with a MultiIndex in pandas在 Pandas 中使用 .loc 和 MultiIndex
【发布时间】: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  

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案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
    

    【讨论】:

    【解决方案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  
    

    【讨论】:

    猜你喜欢
    • 2022-12-07
    • 2018-12-04
    • 2021-12-06
    • 2021-05-20
    • 1970-01-01
    • 2016-10-21
    • 2021-12-02
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多