我不确定多索引是如何工作的,所以我可能只是在这里尝试做错事。如果我有一个数据框
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 索引的目的?
我不确定多索引是如何工作的,所以我可能只是在这里尝试做错事。如果我有一个数据框
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 索引的目的?
您可以使用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
作为替代方案,您可以使用df.loc
:
>>> df.loc[(slice(None),2),:]
Value
A B
1 2 6.87
2 2 9.87
元组按顺序访问索引。因此,slice(None)
从 index 中获取所有值'A'
,第二个位置限制基于第二级索引,'B'=2
在此示例中。:
指定您想要所有列,但您也可以对那里的列进行子集 。
如果您只想返回横截面,请使用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_1
index_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