使用fuzzywuzzy删除数据帧上的所有不同字符串

Posted

技术标签:

【中文标题】使用fuzzywuzzy删除数据帧上的所有不同字符串【英文标题】:Remove all different string on dataframe using fuzzywuzzy 【发布时间】:2022-01-22 17:57:18 【问题描述】:

我想从数据框中删除所有不同的字符串并保留所有“相似”的字符串。

例如,我有这样的数据:

store_name
------------
Mcdonalds
KFC
Burger King
Mcdonald's
Mcdo
Taco bell

上面我们需要比较的商店是第一行Mcdonalds。有了这个,我们需要删除其他商店并保留与我们正在检查的商店相似的所有商店。

这是预期的输出:

store_name
------------
Mcdonalds
Mcdonald's
Mcdo

该过程将继续,直到它检查到Taco bell

通过比较字符串相似度,我使用fuzzy-wuzzy 库。如果我们比较两个字符串并且它给出了 90+ 的相似率,那么我们将它标记为相似字符串。但是如何使用 drop 过滤掉整个数据框?

从两个字符串比较:

ratio = fuzz.token_set_ratio(string_1, string_2)

过滤整个数据框:

    # TODO: ERROR on this since we are comparing dataframe, not string.
    for index, row in data_df.iterrows():
        copied_data_df = data_df.copy()
        store_name = data_df['store_name']
        copied_data_df.drop(fuzz.token_set_ratio(store_name, copied_data_df) >= 90, inplace=True)

【问题讨论】:

【参考方案1】:

因此,使用以下数据框:

import pandas as pd

from fuzzywuzzy import fuzz

df = pd.DataFrame(
    
        "store_name": [
            "Mcdonalds",
            "KFC",
            "Burger King",
            "Mcdonald's",
            "Mcdo",
            "Taco bell",
        ]
    
)

你可以这样做:

# Calculate similarities between first row value and other rows
# and save corresponding indexes in a new column "match"
df["match"] = df["store_name"].map(
    lambda x: [
        i
        for i, _ in enumerate(df["store_name"])
        if fuzz.ratio(x, df.loc[0, "store_name"]) > 80
    ]
)

# Select row match and clean up
df["match"] = df["match"].apply(lambda x: x if len(x) > 0 else pd.NA)
df = df.dropna().drop(columns="match").reset_index(drop=True)

哪些输出:

print(df)

   store_name
0   Mcdonalds
1  Mcdonald's
2        Mcdo

【讨论】:

以上是关于使用fuzzywuzzy删除数据帧上的所有不同字符串的主要内容,如果未能解决你的问题,请参考以下文章

匹配不同数据帧上的多列并获得其他列作为结果

fuzzywuzzy:计算两个字符串之间的相似度

使用pyspark查找每个对应列的两个数据帧上的值差异

在 Python Pandas 的数据帧上使用字符串方法?

为什么过滤器在spark数据帧上默认删除空值?

使用fuzzywuzzy python比较和分组字符串的嵌套循环