как удалить дубликаты из ячейки столбца в csv

#python #pandas #csv #duplicates

Вопрос:

у меня есть csv-файл, который выглядит так:

место встречи подачи котелок
a 1 п кумарп кумарп кумарз ханз хан
a 2 АБ ДиндаАБ ДиндаЗМ Поллок, Минтай,ПСР Орам
b 1 А НехраА НехраА НехраАЗМ Минтай
b 2 Б Либ Либ Лиср Уотсонсрр Уотсон
c 1 СМ Минтай минтай Диндаа Диндаа

Желаемый Результат

место встречи подачи котелок нет.боулер
a 1 п кумар,з хан 2
a 2 АБ Динда,С. М. Поллок 3
b 1 А Нера,СМ Поллок,,JDP Орам 2
b 2 Би Ли,старший Уотсон 2
c 1 СМ Поллок,АБ Динда 2

и AB Dinda,SM Поллок и SM Поллок,AB Dinda будут считаться одинаковыми, когда мы создадим фиктивную колонку

Код, который я использую

 drop_duplicates(subset ="bowler",
                 keep = False, inplace = True)
 

я знаю, что мой код неверен

Ответ №1:

Предположим, у вас есть этот фрейм данных:

   venue  innings                                         bowler
0     a        1              p kumarp kumarp kumarz khanz khan
1     a        2  AB DindaAB DindaSM PollockSM Pollock,JDP Oram
2     b        1               A NehraA NehraA NehraASM Pollock
3     b        2              B LeeB LeeB LeeSR WatsonSR Watson
4     c        1           SM PollockSM PollockAB DindaAB Dinda
 

Затем вы можете использовать регулярное выражение, чтобы попытаться очистить свои данные. Например:

 import re


def clean(x):
    m = re.findall(r"(.{5,})1", x)  # 5 is minimal lenght of a name, you can tweak this variable
    for name in m:
        x = x.replace(name, "").strip(",")
    return ",".join(m   [x]).strip(",")


df.bowler = df.bowler.apply(clean)
df["no of bowlers"] = df.bowler.apply(lambda x: len(x.split(",")))
print(df)
 

С принтами:

   venue  innings                        bowler  no of bowlers
0     a        1                p kumar,z khan              2
1     a        2  AB Dinda,SM Pollock,JDP Oram              3
2     b        1           A Nehra,ASM Pollock              2
3     b        2               B Lee,SR Watson              2
4     c        1           SM Pollock,AB Dinda              2
 

Ответ №2:

Вам нужно regex будет извлечь дубликаты с помощью пользовательской функции, к которой вы применяете столбец:

 import re

df = pd.read_csv('filename.csv')

def clean_bowler(text):
    duplicates = [i for i in re.findall(r'(. ?)1 ', text) if len(i)>2] # extract repetitive string patterns and filter out small repetitive string patterns within names (eg recurring letters), you can change the threshold of 2
    other_words = [re.sub(r'[^a-zA-Zds:]', '', i) for i in re.split(r'|'.join(duplicates),text) if i] #filter out the other words using the duplicates as delimiters. Note: there is no way to identify consecutive unique names separately
    return duplicates   other_words

df['bowler'] = df['bowler'].apply(clean_bowler)
df['no.bowler'] = df['bowler'].apply(len)
 

выход:

место встречи подачи котелок нет.котелок
0 a 1 [«п кумар», «з хан»] 2
1 a 2 [‘AB Dinda’, ‘SM Поллок’, ‘JDP Oram’] 3
2 b 1 [«А Нера», «АСМ Поллок»] 2
3 b 2 [«Би Ли», «старший Уотсон»] 2
4 c 1 [«СМ Поллок», «АБ Динда»] 2