#python #python-3.x #regex #pandas #dataframe
#python #python-3.x #регулярное выражение #pandas #фрейм данных
Вопрос:
Из приведенного ниже списка я могу удалить не алфавитные символы, но все равно не дотягиваю. Я хочу, чтобы ничья была устранена, не влияя на желаемый результат.
df=pd.DataFrame({'Teams': ['Lakefield United',
'101002 Castle FC pk, ½ 1.81 o 3.05 o Un 2 1.92 o',
'101003 Draw 3.00 o',
'Boms',
'101005 Riverside FC pk 2.11 o 2.86 o Un 2, 2½ 1.78 o',
'101006 Draw 3.10 o',
'Barmley',
'101011 Colsely Lakers -1, -1½ 2.04 o 1.46 o Un 2½, 3 1.83 o',
'101012 Draw 4.40 o',]})
Требуемые элементы: и т.д. 'Lakefield UnitednCastle FC','BomsnRiverside FC','BarmleynColsely Lakers'
Комментарии:
1. Получить первую команду легко, просто выберите каждый третий элемент. Однако данные с именем команды противника невозможно обработать вслепую, поскольку формат отличается для каждого из них. У некоторых есть
pk
после имени команды, у одного нет. У двух есть,
после элемента после имени команды, у одного нет.FC
В них есть два имени команд, одно нет. Понимаете, что я имею в виду? Вам нужно будет сгенерировать существующий список со всеми возможными названиями команд, а затем выполнить поиск по каждому из них, пока не получите совпадение.2. @MattDMo Спасибо за информацию. Будет выполнено.
Ответ №1:
Как предлагали другие, для этого требуется создать список завершения для определения того, когда заканчивается имя второй команды. Ниже приведен один из способов сделать это. Возможно, вам потребуется добавить больше элементов в список завершения, но их будет ограниченное количество. Я также преобразовал фрейм данных в список для удобства манипулирования.
lst = df.to_numpy().tolist() #convert dataframe to list
termination_list = [",", "p", "-"] #develop list of strings that would terminate the team name
termination_list = [str(n) for n in range(10)] #add number strings to termination_list
result = []
for i in range(len(lst)):
if i% 3 == 0: #string containing first team
next_string = lst[i 1][0] #string containing second team
next_team = ""
for j in range(6, len(next_string)):
if next_string[j] in termination_list:
break
next_team = next_string[j] #construct next team name, letter by letter
result.append((lst[i][0], next_team)) #append tuple of (first team, second team)
print(result)
Обратите внимание, что этот код может сократить имя любой команды, в которой есть «p». Вы можете исправить это, уточнив список завершения.
Комментарии:
1. Спасибо. Я проработаю ваше решение.