Cómo agregar una columna de contador secuencial en grupos usando Pandas groupby

Siento que hay una manera mejor que esta:

import pandas as pd df = pd.DataFrame( [['A', 'X', 3], ['A', 'X', 5], ['A', 'Y', 7], ['A', 'Y', 1], ['B', 'X', 3], ['B', 'X', 1], ['B', 'X', 3], ['B', 'Y', 1], ['C', 'X', 7], ['C', 'Y', 4], ['C', 'Y', 1], ['C', 'Y', 6]], columns=['c1', 'c2', 'v1']) def callback(x): x['seq'] = range(1, x.shape[0] + 1) return x df = df.groupby(['c1', 'c2']).apply(callback) print df 

Lograr esto:

  c1 c2 v1 seq 0 AX 3 1 1 AX 5 2 2 AY 7 1 3 AY 1 2 4 BX 3 1 5 BX 1 2 6 BX 3 3 7 BY 1 1 8 CX 7 1 9 CY 4 1 10 CY 1 2 11 CY 6 3 

¿Hay una manera de hacerlo que evite la callback?

use cumcount() , vea los documentos aquí

 In [4]: df.groupby(['c1', 'c2']).cumcount() Out[4]: 0 0 1 1 2 0 3 1 4 0 5 1 6 2 7 0 8 0 9 0 10 1 11 2 dtype: int64 

Si quieres pedidos a partir de 1

 In [5]: df.groupby(['c1', 'c2']).cumcount()+1 Out[5]: 0 1 1 2 2 1 3 2 4 1 5 2 6 3 7 1 8 1 9 1 10 2 11 3 dtype: int64 

El código de trabajo completo

 import pandas as pd df = pd.DataFrame( [['A', 'X', 3], ['A', 'X', 5], ['A', 'Y', 7], ['A', 'Y', 1], ['B', 'X', 3], ['B', 'X', 1], ['B', 'X', 3], ['B', 'Y', 1], ['C', 'X', 7], ['C', 'Y', 4], ['C', 'Y', 1], ['C', 'Y', 6]], columns=['c1', 'c2', 'v1']) df['seq'] = df.groupby(['c1', 'c2']).cumcount() + 1 print(df) 

Salida

  c1 c2 v1 seq 0 AX 3 1 1 AX 5 2 2 AY 7 1 3 AY 1 2 4 BX 3 1 5 BX 1 2 6 BX 3 3 7 BY 1 1 8 CX 7 1 9 CY 4 1 10 CY 1 2 11 CY 6 3