У меня есть следующий набор данных:
test_column
AB124
3847937BB
HP111
PG999-HP222
1222HP
HP3333-22HP
111HP3939DN
Я хочу работать по следующей логике:
Поэтому мой желаемый результат будет выглядеть так:
desired_column
AB
BB
HP
PG
HP
HP
DN
Я пытаюсь создать цикл, но не получается получить желаемый результат.
for index,row in df.iterrows():
target_value = row['test_column'] #array
predefined_code = ['HP'] #array
for code in re.findall("[a-zA-Z]+", target_value): #find all alphabets in the target_column
if (len(code)>2) and not (code in predefined_code):
possible_code = code
if (len(code)>2) and (code in predefined_code):
possible_code = possible_code.Select(code.replace(predefined_code,'',1))
if (len(code)<=2):
possible_code = code
Поскольку случаи взаимоисключающие и полные, логика может быть упрощена до
"Для алфавитной подстроки длины> 2 и" HP "в ней удалите первый" HP ", иначе сохраните подстроку так, как она есть".
Сначала используйте регулярное выражение для удаления не алфавитных частей каждой строки, а затем реализуйте логику с помощью простого оператора if-else.
import pandas as pd
import re
df= pd.DataFrame({'test_column': ['AB124','3847937BB','HP111','PG999-HP222','1222HP','HP3333-22HP','111HP3939DN']})
for index,row in df.iterrows():
target_value = row['test_column'] #array
regex = re.compile("[^A-Z]")
code = regex.sub('',target_value)
if len(code) > 2 and 'HP' in code:
possible_code = code.replace('HP','',1)
else:
possible_code = code
print(possible_code)
дает по желанию:
AB
BB
HP
PG
HP
HP
DN