Tengo un marco de datos y un diccionario. Necesito agregar una nueva columna al marco de datos y calcular sus valores en función del diccionario.
Aprendizaje automático, agregando nuevas características basadas en alguna tabla:
score = {(1, 45, 1, 1) : 4, (0, 1, 2, 1) : 5}
df = pd.DataFrame(data = {
'gender' : [1, 1, 0, 1, 1, 0, 0, 0, 1, 0],
'age' : [13, 45, 1, 45, 15, 16, 16, 16, 15, 15],
'cholesterol' : [1, 2, 2, 1, 1, 1, 1, 1, 1, 1],
'smoke' : [0, 0, 1, 1, 7, 8, 3, 4, 4, 2]},
dtype = np.int64)
print(df, '\n')
df['score'] = 0
df.score = score[(df.gender, df.age, df.cholesterol, df.smoke)]
print(df)
Espero el siguiente resultado:
gender age cholesterol smoke score
0 1 13 1 0 0
1 1 45 2 0 0
2 0 1 2 1 5
3 1 45 1 1 4
4 1 15 1 7 0
5 0 16 1 8 0
6 0 16 1 3 0
7 0 16 1 4 0
8 1 15 1 4 0
9 0 15 1 2 0
fuente
MultiIIndex
. Alternativa:df['score'] =df.set_index(['gender', 'age', 'cholesterol', 'smoke']).index.map(score).fillna(0).to_numpy()
.df
víaset_index
, un nuevoSeries
constructor de vías. Aunque obtiene un beneficio de la alineación del índice cuando se lo asignadf['score']
. Por último,fillna(0, downcast='infer')
hace el trabajo, pero nadie debería preferir esta larga solución con la creación de muchos objetos pandas innecesariamente.merge
podría lograr. Pensé que esa respuesta se publicaría rápidamente, así que opté por una alternativa y, por alguna razón, tenía MultiIndices en mi mente. Estoy de acuerdo, esta probablemente no debería ser la respuesta aceptada, así que espero que eso no suceda.