![](/img/trans.png)
[英]Dealing with abbreviation and misspelled words in DataFrame Pandas
[英]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
返回的第一個值,可以根據所需的閾值調整截止參數,如果不匹配,則使用next
和iter
以獲得可能的添加值 - 這里是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.