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.