Python: Как добавить groupby, но не повлиять на ngroup()?

#python #pandas #pandas-groupby

#python #pandas #pandas-groupby

Вопрос:

для каждого пользователя я хочу уникальный порядок элементов (по мере того, как они просматривают их). Если элемент уже был просмотрен, то не подсчитывайте накопительный счет, а поместите туда уже присвоенное значение. Например, c, d, g и b в таблицах ниже. Я использовал приведенную ниже функцию, но на данный момент она не выполняет свою работу. Если я добавлю ‘user_id’ к групперу, я испорчу ngroup (). Кто-нибудь может мне помочь с этим?

 df['Order Number'] = df.groupby(pd.Grouper(key='Item',sort=False)).ngroup() 1

print(df)
 

Текущий вывод:

   User_id  Item  Order Number
0     1        b            1
1     1        a            2
2     1        c            3
3     1        d            4
4     1        c            3
5     1        d            4
6     1        e            5
7     1        b            1
8     1        f            6
9     1        g            7
10    1        b            1
-----------------------------
11    2        x            8
12    2        g            7
13    2        g            7
14    2        f            6
15    2        h            9
16    2        i            10
17    2        f            11
18    2        k            12
19    2        l            13
 

Желаемый результат:

   User_id  Item  Order Number
0     1        b            1
1     1        a            2
2     1        c            3
3     1        d            4
4     1        c            3
5     1        d            4
6     1        e            5
7     1        b            1
8     1        f            6
9     1        g            7
10    1        b            1
-----------------------------
11    2        x            1
12    2        g            2
13    2        g            2
14    2        f            3
15    2        h            4
16    2        i            5
17    2        f            3
18    2        k            7
19    2        l            8
 

Ответ №1:

Использовать GroupBy.transform с factorize функцией in lambda:

 df['Order Number'] = df.groupby('User_id')['Item'].transform(lambda x: pd.factorize(x)[0]) 1
print (df)
    User_id Item  Order Number
0         1    b             1
1         1    a             2
2         1    c             3
3         1    d             4
4         1    c             3
5         1    d             4
6         1    e             5
7         1    b             1
8         1    f             6
9         1    g             7
10        1    b             1
11        2    x             1
12        2    g             2
13        2    g             2
14        2    f             3
15        2    h             4
16        2    i             5
17        2    f             3
18        2    k             6
19        2    l             7