2017-02-15 2 views
2

здесь я есть dataframeпанды мульти-индексные выбирать данные по логическим массивам

import pandas as pd 
import numpy as np 
data = pd.DataFrame(np.arange(100).reshape(20,5), columns=list('abcde')) 
data = data.set_index(['a', 'b']) 
print(data.head()) 
     c d e 
a b 
0 1 2 3 4 
5 6 7 8 9 
10 11 12 13 14 
15 16 17 18 19 
20 21 22 23 24 

Как я могу выбрать данные использовать Loc функцию логической судьей? Как это: < 20 и Ь> 1

ответ

1

Вы можете использовать Index.get_level_values с boolean indexing:

mask = (data.index.get_level_values('a') < 20) & (data.index.get_level_values('b') > 1) 
print (mask) 
[False True True True False False False False False False False False 
False False False False False False False False] 

print (data[mask]) 
     c d e 
a b    
5 6 7 8 9 
10 11 12 13 14 
15 16 17 18 19 

Решение с DataFrame.query похож как еще один ответ, только изменил & на and:

print (data.query("a < 20 and b > 1")) 
     c d e 
a b    
5 6 7 8 9 
10 11 12 13 14 
15 16 17 18 19 

Query python versus pandas syntax comparison.

1

1) Используйте query непосредственно по именам индексов мульти-индексируется DF выполнить логическое индексирование:

data.query("a < 20 & b > 1") 

2) Используйте eval, если вы хотите иметь булево маску заранее и подмножество DF на основе это позже:

bool_mask = data.eval("a < 20 & b > 1") 
data[bool_mask] 

Результирующая о/р для обоих случаев:

enter image description here

+1

Спасибо, я попробовал ваш код, и он отлично работает. –

Смежные вопросы