Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

810
Vistas
¿Cómo calcular la proporción de valores en una columna de marco de datos de pandas?

Soy nuevo en pandas y decidí aprenderlo jugando con algunos datos que saqué de la API de mi juego favorito. Tengo un marco de datos con dos columnas "playerId" y "ganador" así:

 playerStatus: ______________________ playerId winner 0 1848 True 1 1988 False 2 3543 True 3 1848 False 4 1988 False ...

Cada fila representa un partido en el que participó el jugador. Mi objetivo es transformar este marco de datos o crear uno nuevo de modo que se calcule el porcentaje de victorias para cada ID de jugador. Por ejemplo, el marco de datos anterior se convertiría en:

 playerWinsAndTotals _________________________________________ playerId wins totalPlayed winPct 0 1848 1 2 50.0000 1 1988 0 2 0.0000 2 3543 1 1 100.0000 ...

Me tomó bastante tiempo leer los documentos de pandas, pero en realidad logré lograr esto esencialmente creando dos tablas diferentes (una para encontrar la cantidad de victorias para cada jugador, otra para encontrar el total de juegos para cada jugador) y fusionándolas, luego tomando la proporción de victorias a juegos jugados.

Creando el marco de datos de "ganancias":

 temp_df = playerStatus[['playerId', 'winner']].value_counts().reset_index(name='wins') onlyWins = temp_df[temp_df['winner'] == True][['playerId', 'wins']] onlyWins _________________________ playerId wins 1 1670 483 3 1748 474 4 2179 468 6 4006 434 8 1668 392 ...

Creando el marco de datos "totales":

 totalPlayed = playerStatus['playerId'].value_counts().reset_index(name='totalCount').rename(columns={'index': 'playerId'}) totalPlayed ____________________ playerId totalCount 0 1670 961 1 1748 919 2 1872 877 3 4006 839 4 2179 837 ...

Finalmente, fusionándolos y agregando la columna "winPct".

 playerWinsAndTotals = onlyWins.merge(totalPlayed, on='playerId', how='left') playerWinsAndTotals['winPct'] = playerWinsAndTotals['wins']/playerWinsAndTotals['totalCount'] * 100 playerWinsAndTotals _____________________________________________ playerId wins totalCount winPct 0 1670 483 961 50.260146 1 1748 474 919 51.577802 2 2179 468 837 55.913978 3 4006 434 839 51.728248 4 1668 392 712 55.056180 ...

Ahora, la razón por la que publico esto aquí es porque sé que no estoy aprovechando al máximo lo que los pandas tienen para ofrecer. Parece innecesario crear y fusionar dos marcos de datos diferentes solo para encontrar la proporción de ganancias de los jugadores. Siento que tomé la ruta "escénica" en este caso.

Para alguien con más experiencia que yo, ¿cómo abordaría este problema?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Podemos aprovechar la forma en que los valores booleanos se manejan matemáticamente ( True es 1 y False es 0 ) y usar 3 funciones de agregación sum , count y mean por grupo ( groupby aggregate ). También podemos aprovecharla Agregación con nombre para crear y cambiar el nombre de las columnas en un solo paso:

 df = ( df.groupby('playerId', as_index=False) .agg(wins=('winner', 'sum'), totalCount=('winner', 'count'), winPct=('winner', 'mean')) ) # Scale up winPct df['winPct'] *= 100

df .:

 playerId wins totalCount winPct 0 1848 1 2 50.0 1 1988 0 2 0.0 2 3543 1 1 100.0

DataFrame e importaciones:

 import pandas as pd df = pd.DataFrame({ 'playerId': [1848, 1988, 3543, 1848, 1988], 'winner': [True, False, True, False, False] })
over 4 years ago · Santiago Trujillo Denunciar

0

Puedes intentar algo como esto

 import pandas as pd df = pd.read_csv('data.csv') # If for any reason winner column is a string and not a boolean try # import numpy as np # df['winner'] = np.where(df['winner'] == 'True', 1, 0) df = df.groupby('playerId')['winner'].agg(['count', 'sum']) df['percentage'] = 100 * df['sum'] / df['count'] df = df.rename(columns={'count': 'total', 'sum': 'wins'}) print(df)

huellas dactilares

 total wins percentage playerId 1848 2 1 50.0 1988 2 0 0.0 3543 1 1 100.0

Datos que usé

 playerId,winner 1848,True 1988,False 3543,True 1848,False 1988,False
over 4 years ago · Santiago Trujillo Denunciar

0

En su caso, solo mean que puede producir el pct

 out = df.groupby('playerId')['winner'].agg(['sum','count','mean']) Out[22]: sum count mean playerId 1848 1 2 0.5 1988 0 2 0.0 3543 1 1 1.0
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda