1
votes

Comment simplifier l'utilisation du pivot chez les pandas?

J'ai un dataframe comme suit:

def func(x):
    x['score'] = ['Score' + str(i) for i in range(len(x))]
    return x

df['key'] = df['Sex']  + df['Age'].astype(str)
dg = df.groupby(['Age', 'Sex']).apply(func)
dh =dg.pivot(index='key', columns = 'score', values = 'Score').reset_index().fillna(-1)

score  key  Score0  Score1  Score2
0      F20    30.0    27.0    -1.0
1      M18    25.0    30.0    28.0
2      M19    22.0    -1.0    -1.0

Je veux obtenir ce qui suit:

Age Sex Score0 Score1 Score2
18  M   25     30     28
20  F   30     27     -1
19  M   22     -1     -1

Mes étapes sont: p >

Age Sex Score
18  M   25
20  F   30
19  M   22
18  M   30
20  F   27
18  M   28

Existe-t-il des méthodes plus simples?

Merci.


0 commentaires

3 Réponses :


3
votes

Vous pouvez utiliser pivot_table sur deux colonnes avec assign:

col  Age Sex  Score1  Score2  Score3
0     18   M      25      30      28
1     19   M      22      -1      -1
2     20   F      30      27      -1

Output:

(df.assign(col=df.groupby(['Age','Sex']).cumcount().add(1))
   .pivot_table(index=['Age','Sex'], columns='col',values='Score', fill_value=-1)
   .add_prefix('Score')
   .reset_index()
)


2 commentaires

a écrit à peu près exactement la même réponse, sauf que j'ai ajouté le préfixe avec l'assignation, ce qui entraînerait probablement plus de surcharge


Merci, Quang Hoang.



1
votes

vous pouvez le faire avec set_index et unstack

df.set_index([(df['Sex']+df['Age'].astype(str)).rename('key'), 
              'Score'+df.groupby(['Sex','Age']).cumcount().astype(str)])['Score']\
  .unstack(fill_value=-1).reset_index()
   key  Score0  Score1  Score2
0  F20      30      27      -1
1  M18      25      30      28
2  M19      22      -1      -1


0 commentaires

0
votes

Exécuter :

df.groupby(['Age', 'Sex']).Score.apply(
    lambda grp: grp.reset_index(drop=True))\
    .unstack().fillna(-1, downcast='infer').add_prefix('Score')


1 commentaires

Merci, Valdi_Bo.