gpt4 book ai didi

python - 字符串包含在python中的两个df之间

转载 作者:行者123 更新时间:2023-11-28 22:14:14 26 4
gpt4 key购买 nike

我有两个带有两个字符串列的 df,如下所示:

Df1:原始df有2000行Name

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

第二个 Df:原始 df 有 1000 多个 Item_Name

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

我需要 Name 列中的字符串,它们位于 Item_Name 列中

第一种方法:通过使用 str.contains:

如果它们是一列和几个要匹配的字符串,我知道如何匹配字符串,如下所示:

df[df['Name'].str.contains("paper|cat", na=False)]

但是当有两列字符串(name & Item_name)需要匹配时怎么办

第二种方法:Fuzzywuzzy

matched = []
for row in df1.index:
name = df1.get_value(row,"Name")
for columns in df2.index:
item_name=df2.get_value(columns,"Item_Name")
matched_token=fuzz.token_sort_ratio(name,item_name)
if matched_token> 80:
matched.append([name,item_name,matched_token])

问题是,它会很慢,我想要的预期输出比我从 fuzzywuzzy 得到的多一点。输出如下:

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

总结:

  1. 如果它们是两个具有不同列名的 df,如何做 str.contains
  2. 如何转换 df 以获得上述预期输出

最佳答案

您可以使用 pd.Series.apply使用自定义函数:

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)

print(df1)

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

有一些方法可以提高效率:

  • 仅处理 df1['Name'] 中的唯一项目:apply 是一个逐行循环。
  • 使用列表理解代替 pd.Series.apply。两者都是 Python 级别的循环,但列表理解通常优于 Pandas str 方法。

但以上并没有提高算法的复杂性。为了数量级更好的改进,您应该考虑基于 trie 的算法,例如 this answer利用 Aho–Corasick algorithm .

关于python - 字符串包含在python中的两个df之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53497297/

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