Agregue una columna al marco de datos de Pandas según la multiplicación de búsqueda en el diccionario y luego sume
Tengo un marco de datos de muestra:
import pandas as pd
df = pd.DataFrame({
'id' : [1 ,2, 3],
'pts': [25,20,9],
'ast': [8, 14, 7],
'reb': [1, 4, 9],
'oth': [5,6,7],
'tov': [4, 2, 1]
})
print(df)
id pts ast reb oth tov
0 1 25 8 1 5 4
1 2 20 14 4 6 2
2 3 9 7 9 7 1
Básicamente, quiero aplicar algunos pesos/multiplicar ciertas columnas, luego resumirlas y convertirlas en una nueva columna ( score
). No todas las columnas del df
tienen un mapeo de búsqueda.
Puedo hacer esto aplicando manualmente las matemáticas a cada columna mediante una función:
def f(in_df):
return in_df['pts'] + (in_df['reb'] * 1.2) + (in_df['ast'] * 1.5) - df['tov']
df['score'] = f(df)
print(df)
id pts ast reb oth tov score
0 1 25 8 1 5 4 34.2
1 2 20 14 4 6 2 43.8
2 3 9 7 9 7 1 29.3
Sin embargo, quiero lograrlo usando una búsqueda en el diccionario:
score_dict = {'pts': 1, 'reb': 1.2, 'ast': 1.5, 'tov': -1}
# Something like ..?
df['score'] = df[?].map(lambda d: sum(k * v for k, v in score_dict.items()))
Estaba mirando esta publicación e intentando implementar un mapeo como el siguiente. Sin embargo, esa solución requiere una sola columna para el mapeo; No sé cómo implementarlo correctamente.
Posiblemente desee hacer un producto escalar de los "pesos" por columna, es decir
import pandas as pd
df = pd.DataFrame({
'id' : [1 ,2, 3],
'pts': [25,20,9],
'ast': [8, 14, 7],
'reb': [1, 4, 9],
'tov': [4, 2, 1]
}).set_index('id')
df2 = pd.Series({'pts': 1, 'reb': 1.2, 'ast': 1.5, 'tov': -1})
df['score'] = df.dot(df2)
df
[afuera]:
pts ast reb tov score
id
1 25 8 1 4 34.2
2 20 14 4 2 43.8
3 9 7 9 1 29.3
multiplica cada columna del DataFrame df[['pts', 'reb', 'ast', 'tov']]
por su peso correspondiente especificado en score_dict
y luego suma a lo largo del eje de las columnas para obtener la columna de puntuación.
import pandas as pd
df = pd.DataFrame({
'id': [1, 2, 3],
'pts': [25, 20, 9],
'ast': [8, 14, 7],
'reb': [1, 4, 9],
'tov': [4, 2, 1]
})
score_dict = {'pts': 1, 'reb': 1.2, 'ast': 1.5, 'tov': -1}
# Multiply each column by its weight and sum along columns axis
df['score'] = (df[['pts', 'reb', 'ast', 'tov']] * pd.Series(score_dict)).sum(axis=1)
print(df)
PRODUCCIÓN:
id pts ast reb tov score
0 1 25 8 1 4 34.2
1 2 20 14 4 2 43.8
2 3 9 7 9 1 29.3
Intentar:
df["score"] = (df[score_dict.keys()] * score_dict.values()).sum(axis=1)
print(df)
Huellas dactilares:
id pts ast reb oth tov score
0 1 25 8 1 5 4 34.2
1 2 20 14 4 6 2 43.8
2 3 9 7 9 7 1 29.3