在multiindex中仅对第二个索引使用.loc

sna*_*ack 4 python pandas

我有看起来像这样的多索引数据框:

                value
year    name                
1921    Ah      40     
1921    Ai      90      
1922    Ah      100     
1922    Ai      7
Run Code Online (Sandbox Code Playgroud)

其中yearname是索引。我想选择名称Ai出现的每一行。我已经尝试过df.loc[(:,'Ai')]df.loc['Ai']但是都给出了错误。如何仅使用名称列编制索引?

cs9*_*s95 7

@sacul的回答最惯用,不过这里有一些替代方法。

MultiIndex.get_level_values

df[df.index.get_level_values('name') == 'Ai']

           value
year name       
1921 Ai       90
1922 Ai        7
Run Code Online (Sandbox Code Playgroud)

DataFrame.query

df.query('name == "Ai"')

           value
year name       
1921 Ai       90
1922 Ai        7
Run Code Online (Sandbox Code Playgroud)

DataFrame.loc(axis=0)pd.IndexSlice

与@liliscent的答案类似,但:如果指定,则不需要结尾axis=0

df.loc(axis=0)[pd.IndexSlice[:, 'Ai']]

           value
year name       
1921 Ai       90
1922 Ai        7
Run Code Online (Sandbox Code Playgroud)


sac*_*cuL 6

我会.xs在您的multiindex的第一级上使用(注意:由于python的零索引,因此level=1引用了“第二”索引(name):year您的情况为0级):

df.xs('Ai', level=1, drop_level=False)
# or
df.xs('Ai', level='name', drop_level=False)

           value
year name       
1921 Ai       90
1922 Ai        7
Run Code Online (Sandbox Code Playgroud)

  • 所有的答案都很好,但这是我认为最直接的解决方案。非常感谢。 (2认同)

lll*_*lll 6

如果您愿意loc,可以使用:

In [245]: df.loc[(slice(None), 'Ai'), :]
     ...: 
Out[245]: 
           value
year name       
1921 Ai       90
1922 Ai        7
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,这相当于 `df.loc[pd.IndexSlice[:, 'Ai'], :]`。 (2认同)