首页 > 解决方案 > pd.IndexSlice 列表

问题描述

输入 :

midx = pd.MultiIndex.from_product([['A0','A1'], ['B0','B1','B2','B3']])
columns = ['foo', 'bar']
t = pd.DataFrame(np.arange(16).reshape((len(midx), len(columns))),
                    index=midx, columns=columns)

输出:

In [6]: t
Out[6]:
       foo  bar
A0 B0    0    1
   B1    2    3
   B2    4    5
   B3    6    7
A1 B0    8    9
   B1   10   11
   B2   12   13
   B3   14   15

问题:

v = pd.IndexSlice['A0','B0':'B1']. 我可以访问t.loc[v,:]

In [13]: t.loc[v,:]
Out[13]:
       foo  bar
A0 B0    0    1
   B1    2    3

[v,v],我怎样才能得到以下数据框?

In [13]: f([v,v])
Out[13]:
       foo  bar
A0 B0    0    1
   B1    2    3
   B0    0    1
   B1    2    3

我无法指定这些多索引切片器的列表:t.loc[[v,v],:]将引发 Exception: Unashable type: 'slice'。为什么会这样?使用标量时,我可以轻松列出所需的位置:t.loc[[('A0','B0'),('A0','B1')],:].

标签: pythonpandasindexing

解决方案


使用鲜为人知且未使用axis=0的参数loc

您还可以将轴参数指定给 .loc 以解释在单个轴上传递的切片器。

具有层次索引的高级索引

t.loc(axis=0)[v]

输出:

       foo  bar
A0 B0    0    1
   B1    2    3

根据更新的评论和问题澄清解决:

pd.concat([t.loc[v,:]]*2)

输出:

       foo  bar
A0 B0    0    1
   B1    2    3
   B0    0    1
   B1    2    3

推荐阅读