【问题标题】:Remove all different string on dataframe using fuzzywuzzy使用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)

【问题讨论】:

    标签: python-3.x pandas dataframe fuzzy-search fuzzywuzzy


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多