Прошу помочь сгруппировать одинаковые значение в строке pandas

Рейтинг: 0Ответов: 2Опубликовано: 17.05.2023

Есть следующий dataframe состоящий из одинаковых строк.

id name
1 Оператор фронтального погрузчика
2 Оператор фронтального погрузчика
3 Продавец продовольственных товаров
4 Продавец продовольственных товаров
5 Оператор фронтального погрузчика

Необходимо добавить столбец 'group' следующего вида

id name group
1 Оператор фронтального погрузчика 1
2 Оператор фронтального погрузчика 1
3 Продавец продовольственных товаров 2
4 Продавец продовольственных товаров 2
5 Оператор фронтального погрузчика 1

Ответы

▲ 2Принят

Наверняка есть более элегантные способы, но я смог так:

l_help = [] #список с номерами для каждой уникальной профессии
for i in range(1, len(df['name'].unique())+1):
    l_help.append(i) # заполнение списка номерами
df_help = pd.DataFrame({'name': df['name'].unique(), 'group': l_help}) # датафрейм в котором хранятся уникальные пары профессия-номер
df = pd.merge(left=df, right=df_help, on='name') # объединение в 1 датафрейм
▲ 1

Вообще-то, если данные уже представлены в Pandas, значит скорее всего - это DataFrame. Как вам уже писали, на этом сайте принято данные представлять так, что-бы другие могди легко промоделировать ваш скрипт. Странно, что вы этого не сделали, ну да ладно, наверное вы очень заняты:

df1=pd.DataFrame({'id':[1,2,3,4,5],
                  'name':['Оператор фронтального погрузчика',
                  'Оператор фронтального погрузчика',
                  'Продавец продовольственных товаров',
                  'Продавец продовольственных товаров',
                  'Оператор фронтального погрузчика']})

После этого задача решается в одну строчку:

from sklearn import preprocessing
df1['group']= preprocessing.LabelEncoder().fit_transform(df1['name'])

Результат:

   id                                name  group
0   1    Оператор фронтального погрузчика      0
1   2    Оператор фронтального погрузчика      0
2   3  Продавец продовольственных товаров      1
3   4  Продавец продовольственных товаров      1
4   5    Оператор фронтального погрузчика      0

Или, если группы вам надо именно 1,2,3.... то вот так:

df1['group']= preprocessing.LabelEncoder().fit_transform(df1['name'])+1

   id                                name  group
0   1    Оператор фронтального погрузчика      1
1   2    Оператор фронтального погрузчика      1
2   3  Продавец продовольственных товаров      2
3   4  Продавец продовольственных товаров      2
4   5    Оператор фронтального погрузчика      1

И никаких дополнительных DataFrame и извращений с циклами.