Python/Dict查找最接近的匹配,然后结束循环

Python/Dict查找最接近的匹配,然后结束循环,python,pandas,dictionary,Python,Pandas,Dictionary,尝试将此逻辑应用于以下DF 我有一个df如下 import pandas as pd import numpy as pd df = pd.read_csv('subjects.csv') Subjects Media information Media Digital Media 然后,我尝试将我的主题映射到dict,以输出一个经过验证的主题 d = {'Media' : 'Film & Media', 'Information' : 'ICT', 'Digital' : 'I

尝试将此逻辑应用于以下DF

我有一个df如下

import pandas as pd
import numpy as pd

df = pd.read_csv('subjects.csv') 

Subjects
Media
information Media
Digital Media
然后,我尝试将我的主题映射到dict,以输出一个经过验证的主题

d = {'Media' : 'Film & Media',
'Information' : 'ICT',
'Digital' : 'ICT'}

df['subject_corrected'] = df['subjects'](lambda x: ', '.join([d[i] for i in d if i in x]))

Subjects           subject_corrected
Media              Film & Media
information Media  Film & Media, ICT
Digital Media      Film & Media, ICT
现在使用这个循环通过我的DF给我所有匹配,我希望它找到最接近的匹配并退出循环。因此,数字媒体将是ICT而不是媒体

我试过以下方法,但对我来说不是个好兆头!为了

for k,v in d.items():
    if k in df['subjects']:
        df['subject_corrected'] = d.values():

Subjects           subject_corrected
Media              Film & Media
information Media  ICT
Digital Media      ICT
我看过很多类似的帖子,但没能写出这篇

我是否走错了方向,我是否应该将其传递到两个列表/数组中,并使用if语句循环任何匹配项?dict与2D阵列有何区别

感谢您的帮助

您可以使用:

df['Subjects'].apply(lambda x: ', '.join([d[i] for i in d if i in x])).str.split(', ').str[-1]
输出:

            Subjects      subject_corrected
0              Media      Film & Media
1  Information Media               ICT
2      Digital Media               ICT
您也可以通过下面的代码行直接获得输出,只需从列表中选取最后一个元素

df['Subjects'].apply(lambda x: [d[i] for i in d if i in x][-1])

你能显示预期的输出吗?完成,谢谢@HarvIpanNice one,看看你是否能摆脱这里的申请。太棒了!你能给外行解释一下吗?此外,当我运行此程序时,它会在正确匹配后添加一个额外的空间,我想我需要添加一个.strip来删除空间?谢谢!当这个解决方案起作用时,我给你打了绿色的勾。我想问一下,这里的逻辑是如何运作的。这个循环通过dict来找到第一个匹配项吗?还是它找到了最后一个匹配项?它找到了列表中的所有匹配项,但我们只保留最后一个匹配项。[-1]表示,列表末尾的第一个元素。谢谢。如果可能的话,我会制作一个包含所有映射的dict,然后使用它。