Estoy tratando de iterar entre dos columnas de un marco de datos ("binS99", 'bin3HMax'). Esas columnas tienen valores de 0 a 4. luego me gustaría crear una nueva columna ('Probabilidad') en el mismo marco de datos ("df_selection") tomando los valores de la matriz "Prob". El siguiente código entra en un bucle. alguna idea sobre cómo resolver? gracias

 prob =  [[0,   0.00103,    0.00103],
         [0,    0.00267,    0.00311],
         [0,    0.00688,    0.01000],
         [0,    0.01777,    0.03218]] 

for index, row, in df_selection.iterrows():
    a = int(df_selection.loc[index,"binS99"]) #int(str(row["binS99"]))
    b = int(df_selection.loc[index,"bin3HMax"]) #int(str(row["bin3HMax"]))
   
    df_selection.loc[index,"Probability"]= prob[a][b]

'''

1
Luca Piciullo 31 ago. 2020 a las 09:51

1 respuesta

La mejor respuesta

Creo que primero debe verificar si los valores máximos en las columnas coinciden con el número máximo de valores en las listas y luego usar numpy indexing:

df_selection = pd.DataFrame({
        'A':list('abcdef'),
         'binS99':[0,1,2,0,2,1],
         'bin3HMax':[1,2,1,0,1,0],

})
print (df_selection)
   A  binS99  bin3HMax
0  a       0         1
1  b       1         2
2  c       2         1
3  d       0         0
4  e       2         1
5  f       1         0

prob =  [[0,   0.00103,    0.00103],
         [0,    0.00267,    0.00311],
         [0,    0.00688,    0.01000],
         [0,    0.01777,    0.03218]] 

arr_prob = np.array(prob)
print (arr_prob)
[[0.      0.00103 0.00103]
 [0.      0.00267 0.00311]
 [0.      0.00688 0.01   ]
 [0.      0.01777 0.03218]]

a = df_selection['binS99'].to_numpy()
b = df_selection['bin3HMax'].to_numpy()

df_selection['Probability'] = arr_prob[a, b]
print (df_selection)
   A  binS99  bin3HMax  Probability
0  a       0         1      0.00103
1  b       1         2      0.00311
2  c       2         1      0.00688
3  d       0         0      0.00000
4  e       2         1      0.00688
5  f       1         0      0.00000
0
jezrael 31 ago. 2020 a las 07:18