2017-09-23 2 views
0

Je dois développer une seule ligne de ma base de données Pandas entre deux rangées en divisant la colonne score (contenant les résultats de correspondance) en fonction des espaces.Pandas dataframe: Extension de la colonne en rangées plus numérotation incrémentale

C'est ce que les données ressemble

A B score 
1 2 6-1 6-2 
3 4 6-4 4-6 6-3 

Pour atteindre l'objectif je l'approche de here.

Avec l'approche adaptant légèrement, mon dataframe ressemble à ceci:

A B score   sets 
1 2 6-1 6-2   6-1 
1 2 6-1 6-2   6-2 
3 4 6-4 4-6 6-3  6-4 
3 4 6-4 4-6 6-3  4-6 
3 4 6-4 4-6 6-3  6-3 

Cependant, je voudrais aussi avoir une autre colonne supplémentaire qui représente le nombre de l'ensemble par match. C'est comme un compte cumulatif des ensembles par match. Ma question est, comment la solution liée ci-dessus peut être modifié afin d'obtenir le résultat souhaité, qui se présente comme suit:

A B score   sets setnumber 
1 2 6-1 6-2   6-1  1 
1 2 6-1 6-2   6-2  2 
3 4 6-4 4-6 6-3  6-4  1 
3 4 6-4 4-6 6-3  4-6  2 
3 4 6-4 4-6 6-3  6-3  3 

Je pense que quelque part dans les lignes de code suivant une adaptation qui doit être fait, mais je ne pouvais » t comprendre, mais, comment cela devrait fonctionner:

s = df['score'].str.split(' ').apply(pd.Series, 1).stack() 
s.index = s.index.droplevel(-1) # to line up with df's index 

Répondre

3

Vous pouvez utiliser repeat puis cumcount

In [2915]: dff = df.set_index(['A', 'B'])['score'].repeat(
          df['score'].str.split(' ').str.len() 
           ).reset_index() 

In [2916]: dff 
Out[2916]: 
    A B  score 
0 1 2  6-1 6-2 
1 1 2  6-1 6-2 
2 3 4 6-4 4-6 6-3 
3 3 4 6-4 4-6 6-3 
4 3 4 6-4 4-6 6-3 

In [2917]: dff.assign(setnumber=dff.groupby(['A', 'B']).cumcount()+1) 
Out[2917]: 
    A B  score setnumber 
0 1 2  6-1 6-2   1 
1 1 2  6-1 6-2   2 
2 3 4 6-4 4-6 6-3   1 
3 3 4 6-4 4-6 6-3   2 
4 3 4 6-4 4-6 6-3   3 

Vous pouvez également obtenir dff avec .loc

In [2923]: df.loc[df.index.repeat(df['score'].str.split(' ').str.len())] 
Out[2923]: 
    A B  score 
0 1 2  6-1 6-2 
0 1 2  6-1 6-2 
1 3 4 6-4 4-6 6-3 
1 3 4 6-4 4-6 6-3 
1 3 4 6-4 4-6 6-3 
+0

Je viens d'arriver à cette solution. Y a-t-il une différence? 'df ['setnumber'] = df.groupby (['A', 'B']). cumcount() + 1' – beta

+0

Pas grand chose,' assign' renvoie une copie, votre méthode la définit à 'df'. – Zero

+0

super, merci. acceptera si possible. – beta