#python #regex #pandas
#python #регулярное выражение #pandas
Вопрос:
У меня есть фрейм данных вида:
Room Location
0 jc room g
1 merten 3005
2 merten 2500
3 merten 3005
4 merten 3005
5 merten 3005
6 jc bistro
В настоящее время я пытаюсь проанализировать эти конкретные столбцы, чтобы извлечь все значения из этого указанного списка:
room_list = ['jc','sub', 'hub', 'merten', 'rsch', 'corner pocket', 'mix', 'fenwick']
Таким образом (и довольно неэффективно) Я использую:
room_list = (MASTER_TABLE['Room Location'].astype(str).str.lower()).tolist()
room_string = ''.join(room_list)
room_freq = re.findall(r'|'.join(room_list), room_string)
Повторяю, после некоторой предварительной обработки я превращаю столбец в список, затем в строку, затем выполняю это:
freqs = {}
for item in room_freq:
freqs[item] = freqs.get(item, 0) 1
num_sort_freqs = dict(sorted(freqs.items(), key=lambda x: x[1], reverse = True))
print('Sorted name occurences: ','n')
print('===================================================================n')
for k, v in num_sort_freqs.items():
print(k, v)
Это работает потрясающе, однако, когда я возвращаю «отсортированный» словарь, я получаю это:
merten 1204 39
jc cinema 35
merten 2500 31
jc gold rm 31
the hub corner pocket 30
К сожалению, он выполняет именно то, что сказано, мой вопрос заключается в следующем:
Как мне проанализировать столбец (или, лучше сказать, список -> строка) и частично сопоставить элемент столбца с элементом указанного списка, ДАЖЕ если к элементу присоединен избыточный «шум» или, например,:
jc room g = jc
merten 3005 = merten
В идеале возвращаемый dict должен иметь только 5 ключей для возврата, те из room_list
и их последующие частоты. Я также пытался удалить все числа, но поскольку некоторые элементы имеют избыточный строковый шум, проблема сохраняется.
Я просмотрел предыдущие связанные вопросы и не нашел ничего конкретного по моей проблеме, но если вы найдете (РЕЛЕВАНТНЫЙ) обман, пожалуйста, дайте мне знать, чтобы я не тратил ваше время. Спасибо!
Комментарии:
1. привет, Себастьян, не могли бы вы использовать jc merten, например, в той же строке?
2. К счастью, нет, поскольку это два разных здания
Ответ №1:
мое решение здесь:
room_list = ['jc','sub', 'hub', 'merten', 'rsch', 'corner pocket', 'mix', 'fenwick']
for tag in room_list:
result = df['Room Location'].str.lower().str.contains(tag).sum()
print(f'{tag} : {result}')
вывод:
jc : 2
sub : 0
hub : 0
merten : 5
rsch : 0
corner pocket : 0
mix : 0
fenwick : 0
если вы хотите, чтобы на выходе был dict, просто сделайте это:
result= {}
for tag in room_list:
result[tag] = df['Room Location'].str.lower().str.contains(tag).sum()
или решение от Chris:
result = {tag : df['Room Location'].str.lower().str.contains(tag).sum() for tag in room_list}
Комментарии:
1. понимание словаря должно быть немного быстрее:
{tag : df['Room Location'].str.lower().str.contains(tag).sum() for tag in room_list}
2. Это работает отлично! Я также пробую подход к пониманию dict.
3. да, извините, я допустил ошибку копирования-вставки в решении dict, сейчас ее исправляют