2015-09-24 2 views
1

Я имею DataFrame произвольной длины, с X столбцов (позволяет сказать, 10):фильтр панды DataFrame через список dicts

>>> names = ['var_' + str(x) for x in range(1, 11)] 
>>> names 
['var_1', 'var_2', 'var_3', 'var_4', 'var_5', 'var_6', 'var_7', 'var_8', 'var_9', 'var_10'] 
>>> df = pd.DataFrame(np.random.randint(100, size=(10,10)), columns = names) 
>>> df 
    var_1 var_2 var_3 var_4 var_5 var_6 var_7 var_8 var_9 var_10 
0  39  49  6  39  16  41  8  86  23  52 
1  6  16  21  20  81  97  83  25  56  73 
2  72  97  43  50  10  46  22  75  7  18 
3  20  35  69  59  14  24  57  31  47  20 
4  39  93  45  80  74  87  83  50  52  67 
5  93  75  83  67  40  46  79  11  31  95 
6  75  76  57  82  69  98  74  75  93  13 
7  35  19  28  67  39  23  72  16  63  67 
8  93  87  52  25  63  29  46  64  78  12 
9  81  43  4  90  88  64  1  83  26  22 

Теперь я хочу, чтобы отфильтровать DataFrame построчно, используя список dicts:

>>> test_dict_1 = {'var_1': 89, 'var_2': 12, 'var_3': 34} 
>>> test_dict_2 = {'var_7': 3, 'var_2': 11, 'var_4': 19, 'var_1': 9} 
>>> test_dict_3 = {'var_3': 31} 
>>> filter = [test_dict_1, test_dict_2, test_dict_3] 

Чтобы получить что-то в результате (dict? DataFrame? Few DataFrames?), Который содержит только те строки, по крайней мере, один из переданного фильтра (т.е. все переменные имеют одинаковые значения в строке, как в фильтре). Кроме того, я должен знать, какие фильтры прошли.

Я совершенно новичок в пандах, поэтому я немного смущен, если я могу сделать это без циклов «за». Любые решения, пожалуйста?

Я знаю о цепных решениях, таких как df [(df.A == 1) & (df.D == 6)], но как-то возможно иметь несколько разных фильтров? Конечная цель состоит в том, чтобы каждая строка помечена фильтрами, без петель.

ответ

0

Я не уверен, если я это правильно, но если вы хотите, чтобы отфильтровать dataframe по нескольким критериям из dictionnary вы могли бы сделать что-то вроде этого:

In [107]: df 
Out[107]: 
    var_1 var_2 var_3 var_4 var_5 var_6 var_7 var_8 var_9 var_10 
0  45  36  84  24  86  26  44  6  44  15 
1  72  16  67  75  87  89  8  68  32  49 
2  9  49  0  4  77  75  65  9  45  70 

test_dict_1 = {'var_1': 72, 'var_2': 16, 'var_3': 67} 

cond = True 
for var in test_dict_1.keys(): 
    cond = cond & (df[var] == test_dict_1[var]) 
    df = df.loc[cond] 

, то вы получите:

In [109]: df 
Out[109]: 
    var_1 var_2 var_3 var_4 var_5 var_6 var_7 var_8 var_9 var_10 
1  72  16  67  75  87  89  8  68  32  49 
+0

Thats for one dict, и да, я упомянул об этом решении в своем вопросе. Я говорю о фильтрации со списком dicts, то есть с несколькими подобными dicts. Я думаю, что мне нужно использовать цикл. – loknar

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