在 Col2 中查找 Col1 的项目并注释匹配的百分比

Lookup items of Col1 in Col2 and Comment the matching Percentage

提问人:s_max 提问时间:10/27/2023 更新时间:10/30/2023 访问量:67

问:

我的数据框:

data = {'Col1': ['Bad Homburg', 'Bischofferode', 'Essen', 'Grabfeld OT Rentwertshausen','Großkrotzenburg','Jesewitz/Weg','Kirchen (Sieg)','Laudenbach a. M.','Nachrodt-Wiblingwerde','Rehburg-Loccum','Dingen','Burg (Dithmarschen)'],
        'Col2': ['Rehburg-Loccum','Grabfeld','Laudenbach','Kirchen','Jesewitz','Großkrotzenburg','Nachrodt-','Essen/Stadt','Bischofferode','Bad Homburg','Münster','Burg']}

df = pd.DataFrame(data)

我的 df 中有两列,如下所示:

col1 col2
巴特洪堡 雷堡-洛库姆
Bischofferode 格拉布费尔德
埃森 劳登巴赫
Grabfeld OT Rentwertshausen 基尔兴
大克罗岑堡 耶塞维茨
耶塞维茨/韦格 大克罗岑堡
Kirchen (锡格) 纳赫罗特-
劳登巴赫 a.M. 埃森/施塔特
Nachrodt-Wiblingwerde Bischofferode
雷堡-洛库姆 巴特洪堡
丁根 明斯特
Burg (Dithmarschen) 伯格

我想在 Col2 中查找 col1 数据。如果该项目存在,我想写在Lookup_Value列下的同一行中,并且我还写了匹配的评论百分比。以下是我的预期结果:

col1 col2 Lookup_value 评论
巴特洪堡 雷堡-洛库姆 巴特洪堡 100% 匹配
Bischofferode 格拉布费尔德 Bischofferode 100% 匹配
埃森 劳登巴赫 a.M. 埃森/施塔特 最佳匹配
Grabfeld OT Rentwertshausen 基尔兴 格拉布费尔德 最佳匹配
大克罗岑堡 耶塞维茨 大克罗岑堡 100% 匹配
耶塞维茨/韦格 大克罗岑堡 耶塞维茨 最佳匹配
Kirchen (锡格) 纳赫罗特- 基尔兴 最佳匹配
劳登巴赫 埃森/施塔特 劳登巴赫 a.M. 最佳匹配
Nachrodt-Wiblingwerde Bischofferode 纳赫罗特- 最佳匹配
雷堡-洛库姆 巴特洪堡 雷堡-洛库姆 100% 匹配
丁根 明斯特 不匹配
Burg (Dithmarschen) 伯格 伯格 最佳匹配

我正在尝试这种方式,但不起作用:

def lookup_value_and_comment(row):
    col1_value = row['Col1']
    col2_value = row['Col2']
    
    if col1_value in col2_value:
        if col1_value == col2_value:
            return pd.Series([col1_value, '100% Matched'], index=['Lookup_value', 'Comment'])
        else:
            return pd.Series([col2_value, 'Best Possible Match'], index=['Lookup_value', 'Comment'])
    else:
        return pd.Series(['', 'No Match'], index=['Lookup_value', 'Comment'])

df[['Lookup_value', 'Comment']] = df.apply(lookup_value_and_comment, axis=1)

print(df)
Python 数据帧 vlookup 字符串 文本匹配

评论

0赞 Bushmaster 10/29/2023
创建列的逻辑是什么?Lookup_value
0赞 s_max 10/29/2023
@Bushmaster当在 col2 中找到 col1 的项目时,它将转到以下列:Lookup_value。例如,项目 Bad Homburg 将在 col2 中查看,如果找到,则将其写入 Lookup_value 列下的同一行中。然后它将对 col1 的所有其他项目重复。

答:

0赞 inquirer 10/29/2023 #1

在这里,您用当前行检查当前行,但您需要检查列 col2 的所有行。 由于行并不完全相同,我通过分隔符将列 col1、col2 的分词应用于创建列的列表中。col1_value == col2_valuecol1_valuerow col2_value-, /, and spacecol3, col4

要访问行并拆分它们,请使用 str,使用 isin 进行过滤。

import pandas as pd

df['col3'] = df['col1'].str.split('-|/| ').str[0]
df['col4'] = df['col2'].str.split('-|/| ').str[0]

def lookup_value_and_comment(row):
    col1_value = row['col1']
    col3_value = row['col3']
    ind = df['col4'].isin([col3_value])

    if (df['col2'].isin([col1_value])).any():
        return pd.Series([col1_value, '100% Matched'],
                         index=['Lookup_value', 'Comment'])
    elif ind.any():
        return pd.Series([df.loc[ind, 'col2'].values[0],
                          'Best Possible Match'], index=['Lookup_value', 'Comment'])
    else:
        return pd.Series(['', 'No Match'], index=['Lookup_value', 'Comment'])




df[['Lookup_value', 'Comment']] = df.apply(lookup_value_and_comment, axis=1)

输出:

                           col1              col2                             col3                  col4      Lookup_value              Comment
0                   Bad Homburg    Rehburg-Loccum                   [Bad, Homburg]     [Rehburg, Loccum]       Bad Homburg         100% Matched
1                 Bischofferode          Grabfeld                  [Bischofferode]            [Grabfeld]     Bischofferode         100% Matched
2                         Essen  Laudenbach a. M.                          [Essen]  [Laudenbach, a., M.]       Essen/Stadt  Best Possible Match
3   Grabfeld OT Rentwertshausen           Kirchen  [Grabfeld, OT, Rentwertshausen]             [Kirchen]          Grabfeld  Best Possible Match
4               Großkrotzenburg          Jesewitz                [Großkrotzenburg]            [Jesewitz]   Großkrotzenburg         100% Matched
5                  Jesewitz/Weg   Großkrotzenburg                  [Jesewitz, Weg]     [Großkrotzenburg]          Jesewitz  Best Possible Match
6                Kirchen (Sieg)         Nachrodt-                [Kirchen, (Sieg)]          [Nachrodt, ]           Kirchen  Best Possible Match
7                    Laudenbach       Essen/Stadt                     [Laudenbach]        [Essen, Stadt]  Laudenbach a. M.  Best Possible Match
8         Nachrodt-Wiblingwerde     Bischofferode         [Nachrodt, Wiblingwerde]       [Bischofferode]         Nachrodt-  Best Possible Match
9                Rehburg-Loccum       Bad Homburg                [Rehburg, Loccum]        [Bad, Homburg]    Rehburg-Loccum         100% Matched
10                       Dingen           Münster                         [Dingen]             [Münster]                               No Match
11          Burg (Dithmarschen)              Burg           [Burg, (Dithmarschen)]                [Burg]              Burg  Best Possible Match