Является ли метод регулярных выражений или замены лучшим для очистки списка? среда Pandas

#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. Спасибо. Я проработаю ваше решение.