Для исправленного вопроса :
Группе не нужно. Просто используйте factorize
с кортежем Group
и Category
df['New_Category']= (pd.factorize(list(zip(df.Group, df.Category)))[0] // 2) + 1
Out[272]:
Group Category New_Category
0 A ZA-01 1
1 A ZA-01 1
2 A ZA-01 1
3 A ZA-01 1
4 A XA-01 1
5 A XA-01 1
6 A XA-01 1
7 A XA-01 1
8 A ZZ-12 2
9 A ZX-11 2
10 B YA-01 3
11 B YA-01 3
12 B YA-01 3
13 B YA-01 3
14 B WA-01 3
15 B WA-01 3
16 B WA-01 3
17 B WA-01 3
18 B ZZ-01 4
19 B ZZ-99 4
20 B ZZ-99 4
21 B AA-01 5
Оригинал :
Используйте pd.factorize
и этаж div 2
df['new_category'] = pd.factorize(df.Category)[0] // 2
Out[154]:
Category new_category
0 ZA-01 0
1 ZA-01 0
2 ZA-01 0
3 ZA-01 0
4 XA-01 0
5 XA-01 0
6 XA-01 0
7 XA-01 0
8 YA-01 1
9 YA-01 1
10 YA-01 1
11 YA-01 1
12 WA-01 1
13 WA-01 1
14 WA-01 1
15 WA-01 1
После добавления new_category
выше, если вы хотите сопоставить свои пользовательские категории, просто выполните эти дополнительные шаги
cats = np.array(['A', 'B'])
df['new_category'] = cats[df['new_category']]
Out[163]:
Category new_category
0 ZA-01 A
1 ZA-01 A
2 ZA-01 A
3 ZA-01 A
4 XA-01 A
5 XA-01 A
6 XA-01 A
7 XA-01 A
8 YA-01 B
9 YA-01 B
10 YA-01 B
11 YA-01 B
12 WA-01 B
13 WA-01 B
14 WA-01 B
15 WA-01 B
Добавьте метод @piRSquare ofсоздавать алфавитные категории
from string import ascii_uppercase
from itertools import product
import numpy as np
letters = [*ascii_uppercase]
leading = [''] + letters
cats = np.array([*map(''.join, product(*[leading] * 3, letters))])
или
from string import ascii_uppercase
from itertools import product
cats = np.array([*map(''.join, product(['', *ascii_uppercase], ascii_uppercase))])
cats[df.Category.factorize()[0] // 2]
Out[13]:
array(['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B',
'B', 'B', 'B'], dtype='<U2')