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.
3 Réponses :
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() )
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.
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
Exécuter :
df.groupby(['Age', 'Sex']).Score.apply( lambda grp: grp.reset_index(drop=True))\ .unstack().fillna(-1, downcast='infer').add_prefix('Score')
Merci, Valdi_Bo.