簡體   English   中英

如何替換熊貓數據框中拼寫錯誤的單詞

[英]How to replace misspelled words in a pandas dataframe

我有 2 個熊貓數據幀。 一個包含正確拼寫的單詞列表:

[In]: df1
[Out]:
   words
0  apple
1  phone
2  clock
3  table
4  clean

還有一個單詞拼寫錯誤:

[In]: df2
[Out]:
   misspelled
0        aple
1         phn
2        alok
3     garbage
4        appl
5         pho

目標是使用第一個 DataFrame 中拼寫正確的單詞列表替換第二個 DataFrame 中拼寫錯誤的單詞列。 第二個 DataFrame 可以有多個重復,可以與第一個不同的大小,可以包含不在第一個 DataFrame 中的單詞(或不夠相似以致無法匹配)。

我一直在嘗試使用difflib.get_close_matches並取得了一些成功,但效果difflib.get_close_matches

這是我到目前為止:

x = list(map(lambda x: get_close_matches(x, df1.col1), df2.col1))
good_words = list(map(''.join, x))
l = np.array(good_words, dtype='object')
df2.col1 = pd.Series(l)
df2 = df2[df2.col1 != '']

應用轉換后,我應該讓第二個 DataFrame 看起來像:

[In]: df2
[Out]:
          0
0     apple
1     phone
2     clock
3       NaN
4     apple
5     phone

如果找不到匹配項,該行將替換為NaN 我的問題是我得到的結果如下所示:

[In]: df2
[Out]:
    misspelled
0        apple
1        phone
2   clockclean
3          NaN
4        apple
5        phone

在撰寫本文時,我還沒有弄清楚為什么將某些詞組合在一起。 我懷疑這與difflib.get_close_matches匹配長度和/或字母相似的不同單詞有關。 到目前為止,我在整列中大約有 10% - 15% 的單詞像這樣組合在一起。 提前致謝。

如果想要匹配get_close_matches返回的第一個值,可以根據所需的閾值調整截止參數,如果不匹配,則使用nextiter以獲得可能的添加值 - 這里是np.nan

x = [next(iter(x), np.nan) 
          for x in map(lambda x: difflib.get_close_matches(x, df1.words, cutoff = 0.6), df2.misspelled)]
df2['col1'] = x

print (df2)
  misspelled   col1
0       aple  apple
1        phn  phone
2       alok  clock
3    garbage    NaN
4       appl  apple
5        pho  phone

另一種方法是使用pandas-dedupe
由於您有一個凌亂的數據集和一個規范的數據集(即公報),您可以執行地名詞典重復數據刪除。

pandas-dedupe 可能特別強大,因為它將主動學習與邏輯回歸和聚類相結合。 它讓用戶可以很好地控制如何執行重復數據刪除,同時將繁重的工作降到最低。

示例代碼

import pandas as pd
import pandas dedupe

import pandas as pd
import pandas_dedupe

clean_data = pd.DataFrame({'name': ['apple', 'phone', 'clock', 'table', 'clean']})
messy_data = pd.DataFrame({'name':['aple', 'phn', 'alok', 'garbage', 'appl', 'apple', 'clock', 'phone', 'phone']})


dd = pandas_dedupe.gazetteer_dataframe(
    clean_data, 
    messy_data, 
    field_properties = 'name', 
    canonicalize=True,
    )

# At this point, pandas-dedupe will ask you to label a few examples as duplicates or distinct.   
# Once done, you hit finish and the output will look like this:   

# name      cluster id  confidence  canonical_name
# 0 aple    0.0          0.636356   apple
# 1 phn     1.0          0.712090   phone
# 2 alok    2.0          0.492138   clock
# 3 garbage NaN          NaN        NaN
# 4 appl    0.0          0.906788   apple
# 5 apple   0.0          0.921466   apple
# 6 clock   2.0          0.921466   clock
# 7 phone   1.0          0.921466   phone
# 8 phone   1.0          0.921466   phone

我知道這個問題很老,但我希望這個例子將來對某人有用:)

暫無
暫無

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

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