我想用相同的索引调用那些行。
这是示例数据框
arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
In [16]: df
Out[16]:
0 1 2 3
bar one -0.424972 0.567020 0.276232 -1.087401
two -0.673690 0.113648 -1.478427 0.524988
baz one 0.404705 0.577046 -1.715002 -1.039268
two -0.370647 -1.157892 -1.344312 0.844885
foo one 1.075770 -0.109050 1.643563 -1.469388
two 0.357021 -0.674600 -1.776904 -0.968914
qux one -1.294524 0.413738 0.276662 -0.472035
two -0.013960 -0.362543 -0.006154 -0.923061
我想选择
0 1 2 3
bar one -0.424972 0.567020 0.276232 -1.087401
baz one 0.404705 0.577046 -1.715002 -1.039268
foo one 1.075770 -0.109050 1.643563 -1.469388
qux one -1.294524 0.413738 0.276662 -0.472035
甚至是这种格式
0 1 2 3
one -0.424972 0.567020 0.276232 -1.087401
one 0.404705 0.577046 -1.715002 -1.039268
one 1.075770 -0.109050 1.643563 -1.469388
one -1.294524 0.413738 0.276662 -0.472035
我已经尝试过df['bar','one]
,但是它不起作用。我现在确定应该如何访问多级索引。
答案 0 :(得分:2)
使用DataFrame.xs
,如果需要两个级别,请添加drop_level=False
:
df1 = df.xs('one', level=1, drop_level=False)
print (df1)
bar one -0.424972 0.567020 0.276232 -1.087401
baz one 0.404705 0.577046 -1.715002 -1.039268
foo one 1.075770 -0.109050 1.643563 -1.469388
qux one -1.294524 0.413738 0.276662 -0.472035
对于第二级,用drop=True
用DataFrame.reset_index
删除第一级,因此可以用DataFrame.loc
按标签选择:
df2 = df.reset_index(level=0, drop=True).loc['one']
#alternative
#df2 = df.xs('one', level=1, drop_level=False).reset_index(level=0, drop=True)
print (df2)
0 1 2 3
one -0.424972 0.567020 0.276232 -1.087401
one 0.404705 0.577046 -1.715002 -1.039268
one 1.075770 -0.109050 1.643563 -1.469388
one -1.294524 0.413738 0.276662 -0.472035
使用xs
更常见但没有重复的级别-因此,在删除选择one
之后,此级别:
df3 = df.xs('one', level=1)
print (df3)
0 1 2 3
bar -0.424972 0.567020 0.276232 -1.087401
baz 0.404705 0.577046 -1.715002 -1.039268
foo 1.075770 -0.109050 1.643563 -1.469388
qux -1.294524 0.413738 0.276662 -0.472035
答案 1 :(得分:1)
您可以使用MultiIndex切片(使用slice(None)
代替冒号):
df = df.loc[(slice(None), 'one'), :]
结果:
0 1 2 3
bar one -0.424972 0.567020 0.276232 -1.087401
baz one 0.404705 0.577046 -1.715002 -1.039268
foo one 1.075770 -0.109050 1.643563 -1.469388
qux one -1.294524 0.413738 0.276662 -0.472035
最后,您可以删除第一个索引列:
df.index = df.index.droplevel(0)
结果:
0 1 2 3
one -0.424972 0.567020 0.276232 -1.087401
one 0.404705 0.577046 -1.715002 -1.039268
one 1.075770 -0.109050 1.643563 -1.469388
one -1.294524 0.413738 0.276662 -0.472035
答案 2 :(得分:0)
由于该问题涉及多重索引,并且索引的顺序为“ bar”,然后为“ one”,可以使用df.index命令进行验证:
MultiIndex([('bar', 'one'),
('bar', 'two'),
('baz', 'one'),
('baz', 'two'),
('foo', 'one'),
('foo', 'two'),
('qux', 'one'),
('qux', 'two')],
)
您要查找的输出可以使用df.loc[('bar','one')]
它产生的输出是
0 0.162693
1 0.420518
2 -0.152041
3 -1.039439
Name: (bar, one), dtype: float64