簡體   English   中英

使用 fuzzywuzzy 將列的每個值與單獨數據框列的所有值進行比較的最佳方法是什么?

[英]What's the best way to use fuzzywuzzy to compare each value of a column with all the values of a separate dataframe's column?

在這方面度過了一段非常艱難的時光。 假設我有兩個數據框,一個有水果,另一個有水果糖的類型。 每個數據框中還有很多其他數據。 所以它看起來像這樣:

fruit: 

   fruitId  fruitName
0     1     banana
1     2     orange
2     3     apple
3     4     pear
4     5     lemon

candy:

   candyId  candyName         fruitId
0     1     Orange Julius     null
1     2     Bananarama        null
2     3     Sour Lemon Drops  null
3     4     Chocolate Bar     null
4     5     Applicious        null

我需要將candyName與正確的水果匹配,然后將相應的fruitId放入candy dataframe 中的fruitId列中。為了我的目的,假設.contains根本不起作用; candyName列中有太多創造性的拼寫和完全錯誤的拼寫。

我試圖定義一個使用 fuzzywuzzy 的 function,然后在.map中使用它,但我無法讓 function 工作。 它需要檢查第一個 df 的每個值以查看它是否在第二個中,然后移動到下一個值,等等。我最終構建的函數一直想在它們 (a) 相同的地方進行比較dataframe,或 (b) 在同一行。

我確實找到了解決這個問題的方法,但它很難看,因為它使用了你不應該使用的 iterrows() 。 這里是:

import pandas as pd
from fuzzywuzzy import fuzz

candy_file = 'candy.csv'
fruit_file = 'fruits.csv'
candy = pd.read_csv(candy_file)
fruit = pd.read_csv(fruit_file)

dict = {}

for i, row1 in candy.iterrows():
    for j, row2 in fruit.iterrows():
        if fuzz.partial_ratio(row1['candyName'], row2['fruitName']) >= 80:
            dict[row1['candyName']] = row2['fruitId']

candy['fruitId'] = candy['candyName'].map(dict)

這需要永遠。 比如,10 分鍾完成 500 行。 有一個更好的方法嗎? 我已經為更快的函數編寫了大約一百個不同的代碼片段,但沒有取得任何進展。

謝謝!

它很慢,因為你目前在 O(N^2) 中工作。

與其使用 iterrows,不如使用字典來迭代。 這可以通過以下方式完成:

candydict = candy.to_dict{}
fruitdict = fruit.to_dict{}

for k,v in candydict.items():
   for k2,v2 in fruitdict.items():
      #do the rest of your comparisons here

這應該會大大加快速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM