Столбец, который считает в подгруппах pandas - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть df

df1
    a   b                                  
4   0   1      
5   0   1      
6   0   2      
2   0   3          
3   1   2   
15  1   3   
12  1   3   
13  1   1     
15  3   1   
14  3   1   
8   3   3   
9   3   2   
10  3   1  

df должен быть сгруппирован по a и b, и мне нужен столбец c, который увеличивается от 1 до количества групп в подгруппах

df1
    a   b  c                                
4   0   1  1    
5   0   1  1    
6   0   2  2    
2   0   3  3        
3   1   2  1 
15  1   3  2 
12  1   3  2 
13  1   1  3   
15  3   1  1 
14  3   1  1 
8   3   3  2 
9   3   2  3 
10  3   1  4

Как я могу это сделать?

Ответы [ 4 ]

6 голосов
/ 30 апреля 2020

Мы можем сделать groupby + transform factorize

df['C']=df.groupby('a').b.transform(lambda x : x.factorize()[0]+1)
4     1
5     1
6     2
2     3
3     1
15    2
12    2
13    3
15    1
14    1
8     1
9     1
10    2
Name: b, dtype: int64
0 голосов
/ 30 апреля 2020

Просто чтобы мы могли видеть версию l oop

from itertools import count
from collections import defaultdict

x = defaultdict(count)
y = {}
c = []

for a, b in zip(df.a, df.b):
    if (a, b) not in y:
        y[(a, b)] = next(x[a]) + 1
    c.append(y[(a, b)])

df.assign(C=c)

    a  b  C
4   0  1  1
5   0  1  1
6   0  2  2
2   0  3  3
3   1  2  1
15  1  3  2
12  1  3  2
13  1  1  3
15  3  1  1
14  3  1  1
8   3  3  2
9   3  2  3
10  3  1  1
0 голосов
/ 30 апреля 2020

вы можете использовать groupby.rank, если вам не важен порядок в данных.

df['c'] = df.groupby('a')['b'].rank('dense').astype(int)
0 голосов
/ 30 апреля 2020

Один из вариантов - groupby a, а затем итерация по каждой группе и groupby b. Тогда использовать можно использовать ngroup

df['c'] = np.hstack([g.groupby('b').ngroup().to_numpy() for _,g in df.groupby('a')])

    a  b  c
4   0  1  0
5   0  1  0
6   0  2  1
2   0  3  2
3   1  2  1
15  1  3  2
12  1  3  2
13  1  1  0
15  3  1  0
14  3  1  0
8   3  1  0
9   3  1  0
10  3  2  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...