2017-09-13 2 views
1

J'ai une dataframe qui ressemble à ci-dessous:Comment appliquer la fonction groupby pour obtenir le nombre de mois précédent?

dff = pd.DataFrame({'month': ['1','1','1','1','2','2','2','2','3','3'], 
      'sym': ['abc','pqr','xyz','lmn','abc','pqr','xyz','lmn','aaa','bbb'], 
     'count': ['10','14','25','20','34','23','43','34','10','20']}) 

dff = dff[['sym','month','count']] 
print dff 

    sym month count 
0 abc  1 10 
1 pqr  1 14 
2 xyz  1 25 
3 lmn  1 20 
4 abc  2 34 
5 pqr  2 23 
6 xyz  2 43 
7 lmn  2 34 
8 aaa  3 10 
9 bbb  3 20 

Je veux créer une nouvelle colonne à cette trame de données nommé « prev_count ». Pour la création de cette nouvelle colonne « prev_count » besoin de suivre ci-dessous règle:

  • Si le mois précédent ne sont pas disponibles dans le groupe particulier, alors la valeur « prev_count » devrait être 0.
  • Si le mois précédent est disponible en le groupe particulier, puis la valeur du compte du mois précédent doit être la valeur de "prev_count".

Je l'ai essayé avec la fonction groupby comme ci-dessous:

def f(df): 

    print df 
    return "" 

dff['pre_count'] = dff.groupby('sym').apply(f) 

Mais je suis incapable de comprendre comment je peux garder la valeur de comptage de piste du mois précédent. Est-ce leur façon de pandas de faire une telle manipulation sur les données?

Résultats escomptés:

sym month count prev_count 
0 abc  1 10 0 
1 pqr  1 14 0 
2 xyz  1 25 0 
3 lmn  1 20 0 
4 abc  2 34 10 
5 pqr  2 23 14 
6 xyz  2 43 25 
7 lmn  2 34 20 
8 aaa  3 10 0 
9 bbb  3 20 0 
+0

@ JohnGalt- Ok merci – kit

Répondre

1

Depuis le month est déjà triée. Utilisez shift() et fillna(0) sur sym groupes

In [2878]: dff['prev_count'] = dff.groupby('sym')['count'].shift().fillna(0) 

In [2879]: dff 
Out[2879]: 
    sym month count prev_count 
0 abc  1 10   0 
1 pqr  1 14   0 
2 xyz  1 25   0 
3 lmn  1 20   0 
4 abc  2 34   10 
5 pqr  2 23   14 
6 xyz  2 43   25 
7 lmn  2 34   20 
8 aaa  3 10   0 
9 bbb  3 20   0 

Ou, transform

In [2880]: dff.groupby('sym')['count'].transform(lambda x: x.shift(1)).fillna(0) 
Out[2880]: 
0  0 
1  0 
2  0 
3  0 
4 10 
5 14 
6 25 
7 20 
8  0 
9  0 
Name: count, dtype: object 
+0

@ JohnGalt- Pouvez-vous s'il vous plaît expliquer en détail comment il envisage la date de changement(). Je n'ai pas bien compris. – kit