서문
데이터 클리닝은 복잡하고 지루한(쿠비) 작업이자 전체 데이터 분석 과정에서 가장 중요한 연결고리이기도 합니다. 어떤 사람들은 분석 프로젝트 시간의 80%가 데이터를 정리하는 데 사용된다고 말합니다. 이상하게 들리지만 실제 작업에서는 그렇습니다. 데이터 정리에는 두 가지 목적이 있습니다. 첫 번째는 정리를 통해 데이터를 사용할 수 있도록 하는 것입니다. 두 번째는 데이터를 후속 분석에 더 적합하게 만드는 것입니다. 즉, 세척해야 할 "더티" 데이터와 세척해야 할 클린 데이터도 있습니다.
데이터 분석, 특히 텍스트 분석에서 문자 처리에는 많은 에너지가 필요하므로 문자 처리에 대한 이해도 데이터 분석에 있어서 매우 중요한 능력입니다.
문자열 처리 방법
우선 기본 방법이 무엇인지 알아보겠습니다.
먼저 모두 이해하자 다음 문자열 분할 방법
str='i like apple,i like bananer' print(str.split(','))
문자 str을 쉼표로 분할한 결과:
['i like apple', 'i like bananer']
print(str.split(' '))
공백 기준으로 분할한 결과:
['i' , 'like', 'apple,i', 'like', 'bananer']
print(str.index(',')) print(str.find(','))
두 검색결과는 다음과 같습니다.
12
인덱스를 찾을 수 없으면 인덱스는 오류를 반환하고 find는 -1을 반환합니다.
print(str.count('i'))
The 결과는 다음과 같습니다.
4
connt는 대상 문자열의 빈도를 계산하는 데 사용됩니다.
print(str.replace(',', ' ').split(' '))
결과는 다음과 같습니다.
['i', 'like', 'apple', 'i', 'like', 'bananer']
여기 교체는 쉼표를 공백으로 대체하고 공백을 사용하여 문자열을 분할합니다. 각 단어를 제거하기에 충분합니다.
기존 방법 외에 가장 강력한 문자 처리 도구는 정규식입니다.
정규식
정규식을 사용하기 전에 정규식의 다양한 메소드를 이해해야 합니다.
다음 방법의 사용법을 먼저 살펴보겠습니다. 먼저 일치 방법과 검색 방법의 차이점을 이해하세요.
str = "Cats are smarter than dogs" pattern=re.compile(r'(.*) are (.*?) .*') result=re.match(pattern,str) for i in range(len(result.groups())+1): print(result.group(i))
결과는 다음과 같습니다.
고양이가 개보다 똑똑합니다
고양이
더 똑똑합니다
이런 형태의 pettern 매칭 규칙에 따르면, 일치 및 검색 방법 반환 결과는 동일
이때 패턴을
pattern=re.compile(r'are (.*?) .*')
로 변경하면 일치합니다. 아무것도 반환하지 않으면 검색 결과가 반환됩니다.
개보다 똑똑합니다
똑똑합니다
다음으로 다른 방법의 사용에 대해 알아 보겠습니다.
str = "138-9592-5592 # number" pattern=re.compile(r'#.*$') number=re.sub(pattern,'',str) print(number)
결과는
138-9592-5592
위는 숫자를 추출한 것입니다. # 기호 뒤의 내용을 아무것도 없는 것으로 바꿉니다.
숫자의 크로스바를 추가로 교체할 수 있습니다
print(re.sub(r'-*','',number))
결과는 다음과 같습니다.
13895925592
발견된 문자열을 인쇄하기 위해 find 메소드를 사용할 수도 있습니다
str = "138-9592-5592 # number" pattern=re.compile(r'5') print(pattern.findall(str))
결과는 다음과 같습니다.
['5', '5', '5']
정규식의 전체적인 내용은 상대적으로 방대하며 문자열 일치 규칙에 대한 충분한 이해가 필요합니다. 다음은 특정 일치 규칙입니다.
벡터화된 문자열 함수
분석할 흩어져 있는 데이터를 정리할 때 문자열 정규화 작업이 필요한 경우가 많습니다. .
data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com', 'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'}) print(data)
결과는 다음과 같습니다.
몇 가지 방법을 통해 데이터에 대한 예비 판단을 내릴 수 있습니다. 규제 및 통합의 경우, 포함을 사용하여 각 데이터에
print(data.str.contains('@'))
키워드가 포함되어 있는지 확인합니다. 결과는
입니다.
문자열을 분할하여 필요한 문자열을 추출할 수도 있습니다.
data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com', 'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'}) pattern=re.compile(r'(\d*)@([a-z]+)\.([a-z]{2,4})') result=data.str.match(pattern) #这里用fillall的方法也可以result=data.str.findall(pattern) print(result)
结果为:
chen [(8622, xinlang, com)]
li [(120, qq, com)]
sun [(5243, gmail, com)]
wang [(5632, qq, com)]
zhao NaN
dtype: object
此时加入我们需要提取邮箱前面的名称
print(result.str.get(0))
结果为:
或者需要邮箱所属的域名
print(result.str.get(1))
结果为:
当然也可以用切片的方式进行提取,不过提取的数据准确性不高
data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com', 'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'}) print(data.str[:6])
结果为:
最后我们了解下矢量化的字符串方法
更多Python 데이터 정리 시리즈의 문자열 처리에 대한 자세한 설명相关文章请关注PHP中文网!