df=pd.DataFrame({'a':[1,2,3,4,5,6,7,8],'b':['g1','g1','g1','g1','g2','g2','g2','g2'],'c':['v1','v2','v1','v2','v1','v2','v1','v2']})
df.set_index(['b','c'], inplace=True)
>> df
a
b c
g1 v1 1
v2 2
v1 3
v2 4
g2 v1 5
v2 6
v1 7
v2 8
为什么df.loc['g1','v1']
会返回,
a
b c
g1 v1 1
v1 3
.loc[row,col]
的第二个元素不应该是列标签吗?因为在我的例子中' v1'不是列标签。
为什么没有df.loc[:,'v1']
然后返回,
a
b c
g1 v1 1
v1 3
g2 v1 5
v1 7
如何获得上面的输出?
答案 0 :(得分:1)
在此示例中,数据帧具有多索引(即,在多个列上建立索引)。因此,行键是可迭代的而不是单个值。因此,在df.loc['g1','v1']
示例中,pandas将('g1','v1')
解释为行索引,而不是多索引的第一列和列。
如果只想索引索引的第一列,请使用可迭代类型(可能不完整)作为行索引:
df.loc[['g1'],'a']
答案 1 :(得分:1)
对于多索引,您可以使用查询
df.query("c=='v1'")
Out[255]:
a
b c
g1 v1 1
v1 3
g2 v1 5
v1 7
或IndexSlice
idx = pd.IndexSlice
df.loc[idx[:, 'v1'],:]
Out[257]:
a
b c
g1 v1 1
v1 3
g2 v1 5
v1 7