#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