如果我拥有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)]
在这种情况下,我在数据框本身中没有任何数据,所有需要的数据都存储在索引中,因此数据帧是多余的。与此同时,我想对数据进行查询。
答案 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)