使用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删除数据帧上的所有不同字符串的主要内容,如果未能解决你的问题,请参考以下文章