使用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', :]]
答案 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: ----> ^