Сопоставление частичных значений в столбце DF с указанным списком и извлечение частоты

#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, сейчас ее исправляют