Я читаю файл Excel в фрейм данных, где один из его столбцов имеет от 1 до нескольких значений, разделенных пробелом. Мне нужно найти в столбце строку текста и, если он найден, вернуть полное значение ...

1
surge3333 23 Янв 2021 в 19:10

2 ответа

Лучший ответ

Проблема с использованием replace() заключается в том, что оно будет применяться только к тем, которые соответствуют, а не к элементам, которые вы хотите пропустить / удалить из результатов. Вместо этого используйте findall():

pat = f"((?:{'|'.join(terms)})[^ ]*)"
# `pat` is ((?:/l1/l2/good|/la/lb/sure)[^ ]*)

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

df['name'].str.findall(pat)  # will give all the matches, as a series:

0    [/l1/l2/good/a/b/c, /la/lb/sure/blah]
1                                       []
2                         [/l1/l2/good/ha]
3                      [/la/lb/sure/a/b/c]
Name: name, dtype: object

join результаты с пробелом и снова присваиваем его имени:

df['name'] = df['name'].str.findall(pat).str.join(' ')

Результат df:

  command                                name     date
0  abc123  /l1/l2/good/a/b/c /la/lb/sure/blah  2020-05
1  abcdef                                      2020-05
2    hold                      /l1/l2/good/ha  2020-05
3     why                   /la/lb/sure/a/b/c  2020-06

(Между прочим, в вашем определении DataFrame ваша последняя запись - '/la/lb2/sure/a/b/c' вместо '/la/lb/sure/a/b/c'. Я изменил это. И date - последний столбец в вашем определении.)

1
aneroid 23 Янв 2021 в 18:12

Это разбивает строку на столбцы в каждом пробеле, и для результирующих записей проверяется, являются ли записи в вашем списке терминов их частью. Если есть идеальное совпадение, соответствующие строки объединяются:

df['name'].apply(lambda x: ' '.join([a for a in x.split(' ') for t in terms if a.find(t)!=-1]))

Ограничения: это не относится к частичным совпадениям. Например:

'/l1/l2/good/a/b/c' contains '/l1/l2/good' and therefore would be retained. 
'/l1/l3/good/a/b/c' does not contain '/l1/l2/good' and therefore would not be retained.

При этом такой способ хранения данных не приводит к очень легкодоступным фреймам данных.

0
warped 23 Янв 2021 в 18:05
65861404