pandas 如何在具有多个列表的数据框列中应用模糊匹配并将结果保存在新列中

ibps3vxo  于 2022-12-09  发布在  其他
关注(0)|答案(1)|浏览(135)

我有一个类似的问题,在以下参考中提供的链接有微小的差异,但希望相同的结果:

我有一个dataframe,我想得到dataframe中两列之间的部分比率和令牌。第1列每行只有一个单词,但第2列是一个单词列表,每行的大小不同(我将其改为元组,以使参考文献中的函数正常工作)。
我遇到的主要问题是,在比较过程中,它会遍历第1列,并将每个元素与第2列中的每个元素进行比较,从而创建了一个庞大的 Dataframe ,而我只希望它是1比1。我该如何解决这个问题?

df = pd.DataFrame(
    {
        "id": [1, 2, 3, 4, 5, 6],
        "fruits": ["apple", "apples", "orange", "apple tree", "oranges", "mango"],
        "choices": [
            ("app", "apull", "apple"),
            ("app", "apull", "apple", "appple"),
            ("orange", "org"),
            ("apple"),
            ("oranges", "orang"),
            ("mango"),
        ],
    }
)
    
   id      fruits      choices
0   1       apple      ('app', 'apull', 'apple')
1   2      apples      ('app', 'apull', 'apple', 'appple')
2   3      orange      ('orange', 'org')
3   4  apple tree      ('apple')
4   5     oranges      ('oranges', 'orang')
5   6       mango      ('mango')

在变量资源管理器中,compare提供了什么:

compare = pd.MultiIndex.from_product([df['fruits'], df['choices']]).to_series()

             fruits      choices
    0         apple      ('app', 'apull', 'apple')
    1         apple      ('app', 'apull', 'apple', 'appple')
    2         apple      ('orange', 'org')
    3         apple      ('apple')
    4         apple      ('oranges', 'orang')
    5         apple      ('mango')
    6         apples     ('app', 'apull', 'apple')
    7         apples     ('app', 'apull', 'apple', 'appple')
    8         apples     ('orange', 'org')
    ...

是否可以获得像参考文献1中的第一个输出一样的所需输出,但选择的是多索引元素?
预期输出如参考#1,但我希望选择多索引:

f87krz0w

f87krz0w1#

以下是使用Pandasexplodegroupby的一种方法:

from fuzzywuzzy import fuzz

new_df = (
    df.explode("choices")
    .drop(columns="id")
    .pipe(
        lambda df_: df_.assign(
            ratio=df_.apply(lambda x: fuzz.ratio(x["fruits"], x["choices"]), axis=1),
            token=df_.apply(
                lambda x: fuzz.token_sort_ratio(x["fruits"], x["choices"]), axis=1
            ),
        )
    )
    .groupby(["fruits", "choices"])
    .agg(list)
    .applymap(lambda x: x[0])
)

然后道:

print(new_df)
# Output
                    ratio  token
fruits     choices
apple      app         75     75
           apple      100    100
           apull       60     60
apple tree apple       67     67
apples     app         67     67
           apple       91     91
           appple      83     83
           apull       55     55
mango      mango      100    100
orange     orange     100    100
           org         67     67
oranges    orang       83     83
           oranges    100    100

相关问题