9

我不确定多索引是如何工作的,所以我可能只是在这里尝试做错事。如果我有一个数据框

        Value
A  B         
1  1    5.67
1  2    6.87
1  3    7.23
2  1    8.67
2  2    9.87
2  3    10.23

如果我想访问 B=2 的元素,我该怎么做?df.ix[2] 给了我 A=2。要获得一个特定的值,它似乎是 df.ix[(1,2)] 但如果你不能直接访问它,这就是 B 索引的目的?

4

3 回答 3

6

您可以使用xs

In [11]: df.xs(2, level='B')
Out[11]:
   Value
A
1   6.87
2   9.87

或者:

In [12]: df1.xs(1, level=1)
Out[12]:
   Value
A
1   5.67
2   8.67
于 2013-05-24T23:19:49.617 回答
4

作为替代方案,您可以使用df.loc

>>> df.loc[(slice(None),2),:]
     Value
A B       
1 2   6.87
2 2   9.87

元组按顺序访问索引。因此,slice(None)从 index 中获取所有值'A',第二个位置限制基于第二级索引,'B'=2在此示例中。:指定您想要所有列,但您也可以对那里的列进行子集 。

于 2017-06-07T19:00:18.993 回答
0

如果您只想返回横截面,请使用xs(如@Andy Hayden 所述)。

但是,如果要覆盖原始数据框中的某些值,请改用pd.IndexSlice(with pd.loc)。给定一个数据框df

In [73]: df
Out[73]:
                 col_1  col_2
index_1 index_2
1       1            5      6
        1            5      6
        2            5      6
2       2            5      6

如果你想用where do中的0所有元素覆盖:col_1index_2 == 2

In [75]: df.loc[pd.IndexSlice[:, 2], 'col_1'] = 0

In [76]: df
Out[76]:
                 col_1  col_2
index_1 index_2
1       1            5      6
        1            5      6
        2            0      6
2       2            0      6
于 2020-07-03T14:38:04.713 回答