pandas IndexSlice不接受整数列表

时间:2018-03-17 21:43:05

标签: python pandas dataframe indexing

使用pandas IndexSlice,是否可以使用整数列表?我得到KeyError:当我使用整数列表时,'标签[xxxx]不在[columns]中(即使multiIndex级别的值被格式化为字符串):

vals = np.random.randn(4)
df = pd.DataFrame({'l1': ['A', 'B', 'C', 'B'], 'l2': ['9876', '6789', '5432',
    '1234'], 'l3': ['Y', 'X', 'Y', 'Y'], 'value': vals})
df.set_index(['l1', 'l2', 'l3'], inplace=True)

idx = pd.IndexSlice

# None of the following works
df.loc[idx[:, 6789, :]]
df.loc[idx[:, [6789, 1234], :]]

df.reset_index(inplace=True)
df.l2 = df.l2.astype('str')
df.set_index(['l1', 'l2', 'l3'], inplace=True)
df.loc[idx[:, '6789', :]]

2 个答案:

答案 0 :(得分:3)

首先,你的索引列由字符串组成,没有可能工作。

要切出单个值,请使用惯用语xs

df.xs('6789', level='l2')

          value
l1 l3          
B  X  -1.955361

要获取值列表,请为axis;

指定loc参数
df.loc(axis=0)[idx[:, ['6789', '1234'], :]]

               value
l1 l2   l3          
B  6789 X  -1.955361
   1234 Y   0.703208

注意,对于标量,这也与xs的工作方式相同;

df.loc(axis=0)[idx[:, '6789', :]]

               value
l1 l2   l3          
B  6789 X  -1.955361

答案 1 :(得分:1)

备选方案:

In [76]: df.loc[pd.IndexSlice[:, '6789', :], :]
Out[76]:
               value
l1 l2   l3
B  6789 X   1.306962

PS注意字符串值'6789'和最后:

df.loc[pd.IndexSlice[...], :] 
#  NOTE:     ---->         ^