2014-05-02 8 views
8

Mi sento come se ci sia un modo migliore di questo:miglior modo per aggiungere colonna contatore sequenziale utilizzando pandas.groupby

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 

per raggiungere questo obiettivo:

c1 c2 v1 seq 
0 A X 3 1 
1 A X 5 2 
2 A Y 7 1 
3 A Y 1 2 
4 B X 3 1 
5 B X 1 2 
6 B X 3 3 
7 B Y 1 1 
8 C X 7 1 
9 C Y 4 1 
10 C Y 1 2 
11 C Y 6 3 

C'è un modo per farlo che evita la callback?

+0

vi ringrazio per questa domanda. stava lottando per trovare la formulazione giusta per google. fortunatamente entrambi abbiamo usato "sequenziale"! – tmthyjames

risposta

19

uso cumcount(), vedi Documentazione here

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 

Se volete ordinamenti a partire da 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 
+13

+1: esiste una consulenza parentale su tale funzione? –

+1

cosa intendi con 'parental advice'? – Jeff

Problemi correlati