2015-11-11 2 views
2

У меня есть некоторые данные, которые я прочитал в Python как панды dataframe:Фильтрация питоны панда DataFrame на основе значений из словаря

   Unnamed: 0 Initial_guess Lower_bound Upper_bound Estimated_or_Fixed 
     0   Ka    5  0.000001  10000   Estimated 
     2   Kd    5  0.000001  10000   Estimated 
     3   Ki    5  0.000001  10000   Estimated 
     5   Kr    5  0.000001  10000   Estimated 
     6  R1_I    5  0.000001  10000   Estimated 
     7   PR1    5  0.000001  10000   Estimated 
     8   PR2    5  0.000001  10000   Estimated 
     9  alpha    5  0.000001  10000   Estimated 
     10  Kcd    5  0.000001  10000   Estimated 
     12  Klid    5  0.000001  10000   Estimated 
     18 LR1R2_I    5  1.000000  10000   Estimated 

     Variable_type 
0 Kinetic parameter 
2 Kinetic parameter 
3 Kinetic parameter 
5 Kinetic parameter 
6 Kinetic parameter 
7 Kinetic parameter 
8 Kinetic parameter 
9 Kinetic parameter 
10 Kinetic parameter 
12 Kinetic parameter 
18   Species IC 

Первый столбец unnamed: 0 являются параметрами. У меня много моделей, каждая из которых содержит разные комбинации этих параметров. Моя задача состоит в том, чтобы отфильтровать эту таблицу для каждой модели, удалив любую строку, параметр которой отсутствует в модели. У меня есть словари для каждой модели с параметрами, которые они содержат. Параметры могут быть двух типов: species IC или kinetic parameter. Вот пример из этих словарей для первой модели:

Species_IC: 
{'R1': '2.7109e+02', 'R2': '1.2709e+02', 'R1_I': '2.7109e+03', 'R2_I': '1.2709e+03', 'LR1R2': '1.6913e+00', 'LR1R2_I': '1.6913e+01'} 

Kinetic_parameter: 
{'Ka': '1.0000e+00', 'TGFb': '1.0000e-01', 'Synth': '1.0000e+00', 'PR1': '8.0000e+00', 'Sink': '0.0000e+00', 'PR2': '4.0000e+00', 'alpha': '1.0000e+00'} 

Мой код:

def write_parameter_bounds_file(self): 
    model1=self.all_models_dirs[0] #get first model from a list of model. I'll do it on the first model then generalize to the rest. 
    species=self.get_model_species(model1+'.xml') #get the species dct from this model 
    parameters=self.get_model_parameters(model1+'.xml')#get parameter dct from this model 
    param_info=self.read_parameter_bounds_template() #get all parameters from template. This is the pandas dataframe at the top. 
    estimated_species=[] 
    estimated_params=[] 
    for i in species.keys(): 
     print '\n' 
     for j in param_info[param_info.columns[0]]: 
      if i==j: 
       estimated_species.append(i) 
    for i in parameters.keys(): 
     print '\n' 
     for j in param_info[param_info.columns[0]]: 
      if i==j: 
       estimated_params.append(i) 
    param_list=estimated_params+estimated_species #This is a list of the parameters that need to be included in the output df 

Кто-нибудь знает, как я могу использовать param_list фильтровать исходный панд ФР?

Благодаря

ответ

4

Вы можете использовать функцию isin со списком генерируемой из словаря:

list_Species_IC = Species_IC.keys() 

и получить подмножество dataframe df. Вы можете сбросить индекс по функции reset_index.

Аналогичный подход может быть использован для словаря Kinetic_parameter.

Species_IC = {'R1': '2.7109e+02', 'R2': '1.2709e+02', 'R1_I': '2.7109e+03', 'R2_I': '1.2709e+03', 'LR1R2': '1.6913e+00', 'LR1R2_I': '1.6913e+01'} 

list_Species_IC = Species_IC.keys() 
print list_Species_IC 
#['R1', 'R2', 'R1_I', 'R2_I', 'LR1R2', 'LR1R2_I'] 
out = df[df['Unnamed: 0'].isin(list_Species_IC)].reset_index() 
print out 
# Unnamed: 0 Initial_guess Lower_bound Upper_bound Estimated_or_Fixed 
#4  R1_I    5  0.000001  10000   Estimated 
#10 LR1R2_I    5  1.000000  10000   Estimated 

Все вместе:

Species_IC = {'R1': '2.7109e+02', 'R2': '1.2709e+02', 'R1_I': '2.7109e+03', 'R2_I': '1.2709e+03', 'LR1R2': '1.6913e+00', 'LR1R2_I': '1.6913e+01'} 
Kinetic_parameter = {'Ka': '1.0000e+00', 'TGFb': '1.0000e-01', 'Synth': '1.0000e+00', 'PR1': '8.0000e+00', 'Sink': '0.0000e+00', 'PR2': '4.0000e+00', 'alpha': '1.0000e+00'} 

list_Species_IC = Species_IC.keys() 
list_Kinetic_parameter = Kinetic_parameter.keys() 
list_IC = list_Species_IC + list_Kinetic_parameter 
print list_IC 
#['R1', 'R2', 'R1_I', 'R2_I', 'LR1R2', 'LR1R2_I', 'Ka', 'TGFb', 'Synth', 'PR1', 'Sink', 'PR2', 'alpha'] 
out = df[df['Unnamed: 0'].isin(list_IC)].reset_index() 
print out 
# index Unnamed: 0 Initial_guess Lower_bound Upper_bound \ 
#0  0   Ka    5  0.000001  10000 
#1  4  R1_I    5  0.000001  10000 
#2  5  PR1    5  0.000001  10000 
#3  6  PR2    5  0.000001  10000 
#4  7  alpha    5  0.000001  10000 
#5  10 LR1R2_I    5  1.000000  10000 
# 
# Estimated_or_Fixed 
#0   Estimated 
#1   Estimated 
#2   Estimated 
#3   Estimated 
#4   Estimated 
#5   Estimated 
Смежные вопросы