2017-10-05 2 views
0

J'essaie de générer un tableau croisé dynamique avec le résultat suivant se demandant comment je calcule le # de gagner, perdu, et dessiner .... essentiellement, je veux dire compter uniquement si le résultat == « Win »Python Pivot Table nombre conditionnel

Je ne voulais pas utiliser le résultat en colonne parce que je ne veux pas avoir rupture de la vitesse par Win/perdu/dessiner ... est-il un moyen de compter simplement Nombre de

Name Result  Win Loss Draw Speed 
James 6   2  2  2  50 
Bob  9   7  2  0  48 
Mary  10  5  3  2  70 

Ceci est le code

report = pd.pivot_table(df,index=["Name"], values=["Result", "Speed"], aggfunc= {"Result": len, "Speed": np.mean}, fill_value=0) 

Nous vous remercions à l'avance

+1

"Comptez le nombre de" quoi, exactement? – jrd1

+0

@ jrd1 J'essaie de compter le nombre de Win/Loss/Draw, dans la colonne Result, c'est une chaîne de Win/Loss/Draw .... alors quand je fais "len", j'obtiens le nombre de résultats. ..mais je veux filtrer sur le nombre de victoires .... donc je suppose que len seulement si gagne? – Jister

+0

@ jrd1 en d'autres termes, tandis que Résultat: len me donne combien de jeu chaque personne joue, est-il un moyen pour moi de compter # de victoires .... sans avoir le résultat en tant que colonne – Jister

Répondre

0

En supposant que vos données ressemble à quelque chose comme ceci:

# sample data 
df = pd.DataFrame({ 
    'Name' : ['James']*6 +\ 
      ['Bob']*9 +\ 
      ['Mary']*10, 
    'Result' : ['Win']*2 + ['Loss']*2 + ['Draw']*2 +\ 
       ['Win']*7 + ['Loss']*2 +\ 
       ['Win']*5 + ['Loss']*3 + ['Draw']*2, 
    'Speed' : [50]*6 +\ 
       [48]*9 +\ 
       [70]*10 
}) 

df

Alors filtrez simplement sur 'Win' et pivot:

# Filter on 'Win'; make pivot table 
df[df.Result == 'Win'].pivot_table(index = 'Name', 
            values = ['Result', 'Speed'], 
            aggfunc = {'Result' : 'count', 
               'Speed' : 'mean'}, 
            fill_value = 0).rename(columns = {'Result' : 'Win'}) 

Ou groupby et agrégat:

# groupby.agg() 
df[df.Result == 'Win'].groupby('Name').agg({'Result' : 'count', 
              'Speed' : 'mean'}).rename({'Result' : 'Win'}) 

Mêmes résultats:

result