将DF列中的部分值匹配到指定列表并检索频率

时间:2019-03-08 14:59:30

标签: python regex 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

理想情况下,返回字典仅应包含5个要返回的键,即room_list的键及其后续频率。我也尝试过剥离所有数字,但是由于某些元素具有过多的字符串噪音,因此问题仍然存在。

我已经搜索了以前的相关问题,但没有发现与我的问题有关的任何内容,但是如果您发现(相关)欺骗,请告诉我,这样我就不会浪费您的时间。谢谢!

1 个答案:

答案 0 :(得分:2)

我在这里的解决方案:

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 

如果您希望将字典作为输出,只需执行以下操作:

result= {}
for tag in room_list:
    result[tag] = df['Room Location'].str.lower().str.contains(tag).sum()

或克里斯的解决方案:

result = {tag : df['Room Location'].str.lower().str.contains(tag).sum() for tag in room_list}