[英]How to compare and correct each value in dataframe_1's column with all values in each other dataframe_2's columns?
[英]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.