gpt4 book ai didi

python - 在Python中匹配2个数据框列的字符串

转载 作者:行者123 更新时间:2023-11-30 22:03:34 24 4
gpt4 key购买 nike

我有两个数据框:

Df1:

原始 df 有 1000+ 名称

   Id    Name
1 Paper
2 Paper Bag
3 Scissors
4 Mat
5 Cat
6 Good Cat

第二个 Df:

原始 df 有 1000 多个 Item_Name

Item_ID   Item_Name
1 Paper Bag
2 wallpaper
3 paper
4 cat cage
5 good cat

预期输出:

Id Name         Item_ID
1 Paper 1,2,3
2 Paper Bag 1,2,3
3 Scissors NA
4 Mat NA
5 Cat 4,5
6 Good Cat 4,5

我的代码:

def matcher(x):
res = df2.loc[df2['Item_Name'].str.contains(x, regex=False, case=False), 'Item_ID']
return ','.join(res.astype(str))

df1['Item_ID'] = df1['Name'].apply(matcher)

当前挑战

str.contains 在 name 包含 Paper 并且 Item_Name 包含 Paper Bag 时起作用,但反之则不起作用。因此,在我的示例中,它适用于 df1 的第 1、3、4、5 行,但不适用于第 2 行和第 6 行。因此,它将不会映射行df1 的第 2 行与 df2 的第 3 行

询问

所以,如果你可以帮助我修改代码,以便它也可以帮助匹配其他回合

最佳答案

您可以修改自定义matcher函数并使用apply():

def matcher(query):

matches = [i['Item_ID'] for i in df2[['Item_ID','Name']].to_dict('records') if any(q in i['Name'].lower() for q in query.lower().split())]
if matches:
return ','.join(map(str, matches))
else:
return 'NA'

df1['Item_ID'] = df1['Name'].apply(matcher)

返回:

   Id       Name Item_ID
0 1 Paper 1,2,3
1 2 Paper Bag 1,2,3
2 3 Scissors NA
3 4 Mat NA
4 5 Cat 4,5
5 6 Good Cat 4,5

说明:

我们使用 apply() 将自定义 matcher() 函数应用到 df1['Name'] 的每一行值柱子。在 matcher() 函数中,我们将 df2 转换为字典,其中 Item_ID 作为键,Name > 作为值。然后,我们可以检查当前行值 query 是否存在于 df1Name 值的 any() 中(通过 lower() 转换为小写),如果是这样,那么我们可以将 Item_ID 添加到要返回的列表中。

关于python - 在Python中匹配2个数据框列的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53523965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com