pandas 如何创建一个列作为一个类似的字符串列表到一个新的列?

j2cgzkjk  于 2023-03-16  发布在  其他
关注(0)|答案(1)|浏览(166)

我一直在尝试在Pandas Dataframe 中获得一个新行,它将所有相似的字符串封装为一个列表,并将其放入原始匹配行中。
这是Pandas的原始 Dataframe :

import pandas as pd

d = {'product_name': ['2 pack liner socks', '2 pack logo liner socks', 'b.bare Hipster', 'Lady BARE Hipster Panty'], 'id': [13, 12, 11, 10]}
df = pd.DataFrame(data=d)

我想得到一个如下所示的 Dataframe :

# product_name                  # id          # group
  2 pack liner socks             13           ['2 pack liner socks', '2 pack logo liner socks']
  2 pack logo liner socks        12           ['2 pack liner socks', '2 pack logo liner socks']
  b.bare Hipster                 11           ['b.bare Hipster', 'Lady BARE Hipster Panty']
  Lady BARE Hipster Panty        10           ['b.bare Hipster', 'Lady BARE Hipster Panty']

我尝试了以下方法:

import thefuzz
from thefuzz import process

df["group"] = df["product_name"].apply(lambda x: process.extractOne(x, df["product_name"], scorer=fuzz.partial_ratio)[0])

它抛出下一个错误:
名称错误:未定义名称“fuzz”
我该如何修复此代码,或者另一方面,是否有其他方法可以解决此问题?

x759pob2

x759pob21#

您需要导入fuzz -from thefuzz import process, fuzz,但是使用process.extractOneproduct_name中所有值的列表时,将始终返回该行的实际值,因为它是100%匹配的,所以让我们通过执行df["product_name"].loc[df['product_name'] != x]将其过滤掉

from thefuzz import process, fuzz

df['group'] = df["product_name"].apply(lambda x: sorted([x, process.extractOne(x, df["product_name"].loc[df['product_name'] != x],
                                                                               scorer=fuzz.partial_ratio)[0]]))

              product_name  id                                          group
0       2 pack liner socks  13  [2 pack liner socks, 2 pack logo liner socks]
1  2 pack logo liner socks  12  [2 pack liner socks, 2 pack logo liner socks]
2           b.bare Hipster  11      [Lady BARE Hipster Panty, b.bare Hipster]
3  Lady BARE Hipster Panty  10      [Lady BARE Hipster Panty, b.bare Hipster]

相关问题