Tengo un marco de datos de Pandas que se parece a "
Calculé el número de victorias, derrotas y empates para cada año, y ahora se ve así:
Mi objetivo es calcular el porcentaje de cada grupo de puntuación por año. Para llegar a ser como:
Pero me quedé aquí.
Busqué en este hilo pero no pude aplicarlo en mi df.
¿Alguna idea?
------------------------------------
Aquí hay un método bastante simple que escribí para esta tarea:
Simplemente haz lo siguiente:
cree un marco de datos de la puntuación total dentro de cada año:
puntuación_total = df.groupby('año')['puntuación'].sum().reset_index(nombre = 'puntuación_total_cada_año')fusione el marco de datos original y el nuevo en un solo marco de datos:
df = df.merge(puntuación_total, en = 'año')
calcular los porcentajes:
df['porcentajes'] = 100 * (df['puntuación'] / df['total_score_each_year'])
Eso es todo, espero que te ayude :)
------------------------------------
Podrías intentar usar: df.iat[fila, columna]
se vería así:
percentages = []
for i in range(len(df) // 3):
draws = df.iat[i, 2]
losses = df.iat[i + 1, 2]
wins = df.iat[i + 2, 2]
nbr_of_games = draws + losses + wins
percentages.append[draws * 100/nbr_of_games] #Calculate percentage of draws
percentages.append[losses * 100/nbr_of_games] #Calculate percentage of losses
percentages.append[wins * 100/nbr_of_games] #Calculate percentage of wins
df["percentage"] = percentages
¡Puede que esta no sea la forma más rápida de hacerlo, pero espero que te ayude!
------------------------------------
Similar a la respuesta de @panter, pero en una sola línea y sin crear ningún DataFrame adicional:
df['percentage'] = df.merge(df.groupby('year').score.sum(), on='year', how='left').apply(
lambda x: x.score_x * 100 / x.score_y, axis=1
)
En detalle:
df.groupby('year').score.sum() crea un DataFrame con la suma de la puntuación por año.
df.merge crea un marco de datos igual al df original, pero con la columna puntuación renombrada a puntuación_x y una columna adicional puntuación_y, que representa la suma de todas las puntuaciones para el año de cada fila; how='left' mantiene solo la fila en el DataFrame izquierdo, es decir, df.
.apply calcula para cada uno el porcentaje correspondiente, utilizando puntuación_x y puntuación_y (tenga en cuenta la opción eje=1, para aplicar la lambda fila por fila).
1
bonita frase :)
- Ofir Shorer
28/03/2021 a las 18:14