#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 |