Agregue una columna al marco de datos de Pandas según la multiplicación de búsqueda en el diccionario y luego sume

Resuelto md2614 asked hace 8 meses • 5 respuestas

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 dftienen 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.

md2614 avatar Feb 16 '24 02:02 md2614
Aceptado

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

alvas avatar Feb 15 '2024 19:02 alvas

multiplica cada columna del DataFrame df[['pts', 'reb', 'ast', 'tov']]por su peso correspondiente especificado en score_dicty 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
TheHungryCub avatar Feb 15 '2024 20:02 TheHungryCub

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
Andrej Kesely avatar Feb 15 '2024 21:02 Andrej Kesely