在pandas中使用.multiIndex的.loc

79 投票
4 回答
110363 浏览
提问于 2025-04-18 11:13

有没有人知道能不能用 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 值的系列)。

我的目的是选择数据的一个任意子集,只对这个子集进行一些分析,然后用分析结果更新这些新值。我打算用相同的语法来设置这些数据的新值,所以在这种情况下,链式选择就不太适用了。

这是我正在处理的 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  

4 个回答

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  
5

loc 方法在处理多重索引时非常好用。不过,你需要明白在多重索引上使用 loc 是怎么回事。当你在多重索引上使用 loc 时,必须在 loc 中指定每一个其他的索引值,比如:

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

不过,正如你想象的那样,如果你不知道所有其他的值,这样做可能会很麻烦,所以我们当然可以使用 ':' 来代替。

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

希望这对你有帮助!

20

试试这个交叉截面索引的方法:

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
75

如果你使用的是0.14版本,你可以像下面这样直接把一个元组传给.loc

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

撰写回答