gpt4 book ai didi

python - 将列中相似的字符串替换为相同的字符串

转载 作者:行者123 更新时间:2023-12-02 03:43:49 28 4
gpt4 key购买 nike

我有一个 Pandas 数据框,用于收集进行交易的供应商名称。由于这些数据是从银行对账单中自动收集的,因此许多供应商都很相似……但又不完全相同。总之,我想用一个名称替换供应商名称的不同排列。

我想我可以找到一种方法来做到这一点(见下文),但我是初学者,在我看来这是一个复杂的问题。我真的很想知道更有经验的程序员将如何处理它。

我有一个像这样的数据框(在现实生活中,它大约有 20 列,最多大约 50 行):

     Groceries            Car                Luxuries
0 Sainsburys Texaco wst453 Amazon
1 Sainsburys bur Texaco east Firebox Ltd
2 Sainsbury's east Shell wstl Sony
3 Tesco Shell p/stn Sony ent nrk
4 Tescos ref 657 Texac Amazon EU
5 Tesco 45783 Moto Amazon marketplace

我想找到类似的条目并将它们替换为这些条目的第一个实例,所以我最终会得到以下结果:

     Groceries            Car                Luxuries
0 Sainsburys Texaco wst453 Amazon
1 Sainsburys Texaco wst453 Firebox Ltd
2 Sainsburys Shell wstl Sony
3 Tesco Shell wstl Sony
4 Tesco Texaco wst453 Amazon
5 Tesco Moto Amazon

我的解决方案可能远非最佳。我正在考虑按字母顺序排序,然后按位进行排序,并使用 difflib 中的 SequenceMatcher 之类的东西来比较每对供应商。如果相似度高于一定百分比(我希望使用这个值直到我满意为止),那么这两个供应商将被认为是相同的。我担心我可能会使用大锤来敲开坚果,或者可能需要很长时间(我并不痴迷于性能,但同样我不想等待几个小时才能得到结果)。

真的很想听听人们对这个问题的想法!

最佳答案

乍一看,问题并不复杂,但事实却很复杂。

我使用了名为 fuzzywuzzy 的字符串相似度包来决定必须替换哪个字符串。这个包使用 Levenshtein 相似度,我使用 %90 作为阈值。此外,任何字符串的第一个单词都用作比较字符串。这是我的代码:

import pandas
from fuzzywuzzy import fuzz

# Replaces %90 and more similar strings
def func(input_list):
for count, item in enumerate(input_list):
rest_of_input_list = input_list[:count] + input_list[count + 1:]
new_list = []
for other_item in rest_of_input_list:
similarity = fuzz.ratio(item, other_item)
if similarity >= 90:
new_list.append(item)
else:
new_list.append(other_item)
input_list = new_list[:count] + [item] + new_list[count :]

return input_list

df = pandas.read_csv('input.txt') # Read data from csv
result = []
for column in list(df):
column_values = list(df[column])
first_words = [x[:x.index(" ")] if " " in x else x for x in column_values]
result.append(func(first_words))

new_df = pandas.DataFrame(result).transpose()
new_df.columns = list(df)

print(new_df)

输出:

     Groceries    Car Luxuries
0 Sainsbury's Texac Amazon
1 Sainsbury's Texac Firebox
2 Sainsbury's Shell Sony
3 Tesco Shell Sony
4 Tesco Texac Amazon
5 Tesco Moto Amazon

更新:

更易读的 func 版本,产生相同的结果:

def func(input_list):
for i in range(len(input_list)):
for j in range(len(input_list)):
if i < j and fuzz.ratio(input_list[i], input_list[j]) >= 90:
input_list[i] = input_list[j] # Keep the last encountered item
# Use following line to keep the first encountered item
# input_list[j] = input_list[i]

关于python - 将列中相似的字符串替换为相同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47500315/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com