代码之家  ›  专栏  ›  技术社区  ›  Umar.H

python/pandas dict查找最接近的匹配然后结束循环

  •  3
  • Umar.H  · 技术社区  · 7 年前

    尝试将此逻辑应用于以下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给我 全部的 匹配,我希望它找到最接近的匹配并退出循环。所以数字媒体就是信息和通信技术 媒体

    我试过以下的方法,但对我来说并不是什么好兆头!对于

    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数组有何不同。

    如有任何帮助,我们将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  2
  •   harvpan    7 年前

    您可以使用:

    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])