天天看点

错误、不一致数据处理(fuzzywuzzy函数的使用)

继前面几天的比赛后的又一场比赛(简单的数据处理)

其一:做个学习的资料记录。其二:分享出来,供大家参考。

这是关于 当数据中存在差异数据或者输入错误的不一致数据的处理 的问题。

简单说一部分:有时候当我们在处理数据时,其中包含有一些大小写不一致,或者字母拼写有问题的错误,为了得到更为精确的数据集,我们需要对这部分的异常数据进行处理。

import pandas as pd        #导入相关的模块
import fuzzywuzzy
from fuzzywuzzy import process
import chardet
           
with open("d:/challeng data.csv","rb") as f:
	result = chardet.detect(f.read(100000))
print(result)
           
{'encoding': 'Windows-1252', 'confidence': 0.73, 'language': ''}        #日常对文件的编码问题进行判断(继上一篇的知识)
           
suicide_attacks = pd.read_csv("d:/challeng data.csv",encoding="Windows-1252")
           

使用正确的编码来读取文件,是第一步。

cities = suicide_attacks['City'].unique()    #获得City这一列的数据集
cities.sort()        #排序后查看其内容
print(cities)
           
'D. I Khan' 'D.G Khan' 'D.G Khan '        #这是其中一部分的数据,可以看出,它们的名字相似,但是有的字母不一致或者空格符号
           
suicide_attacks['City'] = suicide_attacks['City'].str.lower()    #使用lower 将原数据的城市名变为小写
suicide_attacks['City'] = suicide_attacks['City'].str.strip()    #使用strip 将原数据的城市名的空格去掉
           
array(['attock', 'bajaur agency', 'bannu', 'bhakkar', 'buner', 'chakwal',
       'chaman', 'charsadda', 'd. i khan', 'd.g khan', 'd.i khan',        #这行可以看清楚,这几个名字的变化
       'dara adam khel', 'fateh jang', 'ghallanai, mohmand agency',
       'gujrat', 'hangu', 'haripur', 'hayatabad', 'islamabad',
       'jacobabad', 'karachi', 'karak', 'khanewal', 'khuzdar',
       'khyber agency', 'kohat', 'kuram agency', 'kurram agency',
       'lahore', 'lakki marwat', 'lasbela', 'lower dir', 'malakand',
       'mansehra', 'mardan', 'mohmand agency',
       'mosal kor, mohmand agency', 'multan', 'muzaffarabad',
       'north waziristan', 'nowshehra', 'orakzai agency', 'peshawar',
       'pishin', 'poonch', 'quetta', 'rawalpindi', 'sargodha',
       'sehwan town', 'shabqadar-charsadda', 'shangla', 'shikarpur',
       'sialkot', 'south waziristan', 'sudhanoti', 'sukkur', 'swabi',
       'swat', 'taftan', 'tangi, charsadda district', 'tank', 'taunsa',
       'tirah valley', 'totalai', 'upper dir', 'wagah', 'zhob'],
      dtype=object)
           

下面我们对"d.i khan"这个名字进行模糊匹配:

matches = fuzzywuzzy.process.extract("d.i khan", cities, limit=10, scorer=fuzzywuzzy.fuzz.token_sort_ratio)
           

参数(匹配字符串,数据集,限制,scorer=方法)

我们能得到模糊匹配的结果:

[('d. i khan', 100),
 ('d.i khan', 100),
 ('d.g khan', 88),
 ('khanewal', 50),
 ('sudhanoti', 47),
 ('hangu', 46),
 ('kohat', 46),
 ('dara adam khel', 45),
 ('chaman', 43),
 ('mardan', 43)]
           

这个数组中存放的是二维的数据(名字,相似度)

下面我们编写一个子函数来对这些数据的模糊查询和替换:

def replace_matches(df,column,string_to_match,min_ratio = 90):
	strings =  df[column].unique()    #获取"City"列的数据集
	matches = fuzzywuzzy.process.extract(string_to_match,strings,limit=10,scorer=fuzzywuzzy.fuzz.token_sort_ratio)    #进行模糊匹配
	close_matches = [matches[0] for matches in matches if matches[1] >= min_ratio]    #列表循环选出相似度大于等于90的
	rows_with_matches = df[column].isin(close_matches)        #判断这些相似数据存在与原数据中的位置
	df.loc[rows_with_matches,column] = string_to_match        #使用loc  选中City列,选中相似数据所在行  替换为"d.i khan"
           
replace_matches(df=suicide_attacks,column='City',string_to_match='d.i khan')
           

执行完上面的函数调用后,原数据中的与"d.i khan"相似数据将被替换。

这里只是简单的说明了使用fuzzywuzzy模块来进行模糊处理,并没有仔细讲解它的用法。有需要的朋友可以自行google或百度。

继续阅读