Замена повторяющихся ID в датасете

В csv файле +1М записей типа:

product_id;product_name
FUR-BO-10000112;Mania Corner Shelving, Pine

Много записей с одинаковыми product_id и product_name, это нормально, так и должно быть. Но встречаются записи с одинаковым product_id, но разным product_name, причем следуют они не по порядку. Как с помощью python добавить, допустим, '-1' к product_id с другим product_name, чтобы в итоге у одинаковых product_name сохранился одинаковый product_id, а у разных product_name он отличался?


Ответы (1 шт):

Автор решения: strawdog

попробуйте так:

import pandas as pd

df = pd.read_csv("ваш файл", sep=";")

df["product_id"] = df["product_id"] + "-" + (df.groupby("product_id")["product_id"].cumcount()+1).astype("str")

df, соответственно, получится:

          product_id                                      product_name
0  FUR-BO-10000112-1                       Mania Corner Shelving, Pine
1  FUR-BO-10000112-2  Bush Birmingham Collection Bookcase, Dark Cherry
2  FUR-BO-10000668-1                   Sauder Classic Bookcase, Mobile
3  FUR-BO-10000668-2                 Ikea Corner Shelving, Traditional
4  FUR-BO-10002204-1             Mania Floating Shelf Set, Traditional
5  FUR-BO-10002204-2                 Bush Corner Shelving, Traditional
6  FUR-BO-10002204-3                       Bush Classic Bookcase, Pine
​

UPDATE

После уточнений автора вопроса могу предложить следующий вариант:

При df:

   id  name
0   c  ccc1
1   a  aaa1
2   b  bbb3
3   b  bbb1
4   a  aaa1
5   a  aaa2
6   b  bbb3
7   a  aaa2
8   a  aaa1
9   a  aaa3
10  a  aaa3
11  b  bbb2
12  c  ccc1

делаем двойную группировку:

df["new_id"] = df["id"] + "-" + (df.groupby("id")[["name"]].apply(lambda x: x).groupby("name").grouper.group_info[0]).astype("str")

получаем df:

   id  name new_id
1   a  aaa1    a-0
4   a  aaa1    a-0
8   a  aaa1    a-0
5   a  aaa2    a-1
7   a  aaa2    a-1
9   a  aaa3    a-2
10  a  aaa3    a-2
3   b  bbb1    b-3
11  b  bbb2    b-4
2   b  bbb3    b-5
6   b  bbb3    b-5
0   c  ccc1    c-6
12  c  ccc1    c-6

Здесь я специально сделал новую колонку с новым id для наглядности. Разумеется, можно перезаписать и старый id.

→ Ссылка