试图理解pandas中的.loc - python

时间:2018-03-22 20:47:26

标签: python pandas indexing

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

如何获得上面的输出?

2 个答案:

答案 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