2017-09-05 74 views
2

我有一個多指標檢索在大熊貓一個多指標的一個水平的價值

ind = pd.MultiIndex.from_tuples([('A', 0), ('A', 1), ('B', 1), ('B', 2)], names=['Letters', 'Numbers']) 

這洛斯類似的

Letters Numbers 
A  0 
A  1 
B  1 
B  2 

我怎樣才能檢索到第二級的所有值,給定的值第一級?也就是說,給定A,我想得到[0,1],給出B,我想得到[1,2]。

,我能想到的唯一的辦法就是

ind.get_level_values(1)[ind.get_level_values(0) == 'B'] 

但是,這看起來不是很漂亮,我希望有一個更優雅的表達。在那兒?

回答

2

Simpliest和最快的是使用列表理解:

a = [x[1] for x in ind.tolist() if x[0] == 'A'] 
print (a) 

[0, 1] 

另一種可能的解決方案是創建幫手dfboolean indexing

df = pd.DataFrame(ind.tolist(), columns=['a','b']) 
print (df) 
    a b 
0 A 0 
1 A 1 
2 B 1 
3 B 2 

a = df.loc[df['a'] == 'A', 'b'].tolist() 
print (a) 
[0, 1] 

a = df.loc[df['a'] == 'B', 'b'].tolist() 
print (a) 
[1, 2] 

但在我看來你的解決方案是很好(有點改變選擇按級別名稱):

a = ind.get_level_values('Numbers')[ind.get_level_values('Letters') == 'B'].tolist() 
print (a) 
[1, 2] 

個時序

In [197]: %timeit ([x[1] for x in ind.tolist() if x[0] == 'A']) 
100000 loops, best of 3: 2.14 µs per loop 

In [199]: %timeit ind.get_level_values('Numbers')[ind.get_level_values('Letters') == 'B'].tolist() 
1000 loops, best of 3: 377 µs per loop 


In [200]: %%timeit 
    ...: df = pd.DataFrame(ind.tolist(), columns=['a','b']) 
    ...: df.loc[df['a'] == 'A', 'b'].tolist() 
    ...: 
1000 loops, best of 3: 1.06 ms per loop 
+0

其實,我所期待的東西,看起來像'ind.loc [ind.loc [:, '信'] == 'A', '數字']',也就是說,類似的語法就好像那些列不是索引級別一樣。仍然感謝列表理解和時間!我不知道速度比較是否適用於大型DataFrame。你爲什麼使用tolist()?也可以直接在索引上迭代。 – Konstantin

+0

它只與DataFrame工作:(。和我添加列表,但可能沒有必要,我測試它 – jezrael

+1

不,沒必要 – jezrael

相關問題