是否可以在没有DataFrame的情况下查询MultiIndex本身?

时间:2017-06-19 08:11:04

标签: python pandas multi-index

如果我拥有MultiIndex实例本身包含的所有必需数据,我可以查询它而不将其附加到数据框以避免可能的开销吗?

例如:

In [664]: import pandas as pd

In [665]: index = pd.MultiIndex.from_product([['A', 'B'], [1, 2, 3, 4, 5]])

In [666]: df = pd.DataFrame(index=index)

In [667]: df
Out[667]: 
Empty DataFrame
Columns: []
Index: [(A, 1), (A, 2), (A, 3), (A, 4), (A, 5), (B, 1), (B, 2), (B, 3), (B, 4), (B, 5)]

在这种情况下,我在数据框本身中没有任何数据,所有需要的数据都存储在索引中,因此数据帧是多余的。与此同时,我想对数据进行查询。

1 个答案:

答案 0 :(得分:1)

您可以使用索引方法get_loc_level,它接受​​键值和级别:

In[143]:
index.get_loc_level(2, level=1)
Out[143]: 

(array([False,  True, False, False, False, False,  True, False, False, False], dtype=bool),
 Index(['A', 'B'], dtype='object'))

所以这会返回一个布尔掩码的元组,只索引掩码并将其传递给索引:

In[144]:
index.get_loc_level(2, level=1)[0]
Out[144]: array([False,  True, False, False, False, False,  True, False, False, False], dtype=bool)

这将返回分层数组中的级别值:

In[145]:
index[index.get_loc_level(2, level=1)[0]]
Out[145]: 
MultiIndex(levels=[['A', 'B'], [1, 2, 3, 4, 5]],
           labels=[[0, 1], [1, 1]])

然后,您可以调用.values返回索引值:

In[146]:
index[index.get_loc_level(2, level=1)[0]].values

Out[146]: array([('A', 2), ('B', 2)], dtype=object)

这不像用于查询的数据框那样友好,但如果你只想让索引查询,那么这是一种方法

如果要查询特定值,则更容易使用get_level_values,然后使用常用的屏蔽运算符:

In[164]:
index[(index.get_level_values(0) == 'A') & (index.get_level_values(1) == 2)]

Out[164]: 
MultiIndex(levels=[['A', 'B'], [1, 2, 3, 4, 5]],
           labels=[[0], [1]])

以下是显示返回内容的细分:

In[165]:
index.get_level_values(0)

Out[165]: Index(['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'], dtype='object')

In[166]:
index.get_level_values(0) == 'A'

Out[166]: array([ True,  True,  True,  True,  True, False, False, False, False, False], dtype=bool)


In[167]:
index.get_level_values(1) == 2

Out[167]: array([False,  True, False, False, False, False,  True, False, False, False], dtype=bool)