提问人:s_max 提问时间:10/27/2023 更新时间:10/30/2023 访问量:67
在 Col2 中查找 Col1 的项目并注释匹配的百分比
Lookup items of Col1 in Col2 and Comment the matching Percentage
问:
我的数据框:
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)
答:
0赞
inquirer
10/29/2023
#1
在这里,您用当前行检查当前行,但您需要检查列 col2 的所有行。
由于行并不完全相同,我通过分隔符将列 col1、col2 的分词应用于创建列的列表中。col1_value == col2_value
col1_value
row col2_value
-, /, and space
col3, 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
评论
Lookup_value