03数据清洗与自定义函数

前言

1)本节课学习正则表达式的用法,为数据清洗打下基础
2)学习函数相关知识,提高代码的重用性以及可读性

python知识的补充

1、字符替换与正则表达式

  1. 简单的字符替换

    str.replace()

print(help(str.replace))
Help on method_descriptor:

replace(...)
    S.replace(old, new[, count]) -> str
    
    Return a copy of S with all occurrences of substring
    old replaced by new.  If the optional argument count is
    given, only the first count occurrences are replaced.

None
sentence='这个手机才是真的六六六'  
#将“六六六”转为666
s=sentence.replace('六六六','666')
s
'这个手机才是真的666'
sentence='这个手机才是真的六六'  
#将“六六六”转为666
s=sentence.replace('六六','666')
s
'这个手机才是真的666666'
  1. 匹配、替换形式多变的字符

    re.sub

import re
print((help(re.sub)))
Help on function sub in module re:

sub(pattern, repl, string, count=0, flags=0)
    Return the string obtained by replacing the leftmost
    non-overlapping occurrences of the pattern in string by the
    replacement repl.  repl can be either a string or a callable;
    if a string, backslash escapes in it are processed.  If it is
    a callable, it's passed the match object and must return
    a replacement string to be used.

None

重点掌握参数

pattern:表示正则表达式中的模式字符串;
repl:被替换的字符串(既可以是字符串,也可以是函数);
string:要被处理的,要被替换的字符串;
sentence='这个手机才是真的六六六'  
s=re.sub('六六六','666',sentence)
s
'这个手机才是真的666'

pattern:正则表达式的模式字符串

参考资料

常用的正则表达式

{n}:n 是一个非负整数。匹配确定的 n 次。  
{n,}: n 是一个非负整数。至少匹配n 次。
{n,m}:m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。  
\d: 匹配一个数字字符。等价于 [0-9]。  
( ): 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。    
$:匹配输入字符串的结尾位置。  
|:指明两项之间的一个选择。要匹配 |,请使用 \|。  
#匹配一到三个六
sentence='这个手机才是真的六'  
s=re.sub('六{1,3}','666',sentence)
s
'这个手机才是真的666666666'
#匹配13开头的手机号码
s='我的手机号码'+'13567891243'
pattern='13\d{9}'
s=re.sub(pattern,'number',s)
s
'我的手机号码13567891243'
#匹配13开头的手机号码
s='我的手机号码'+'13567891243'
pattern='13[0-9]{9}'
s=re.sub(pattern,'number',s)
s
'我的手机号码number'
#匹配六块钱、八块钱、九块钱
s='我有八块钱'
pattern='(六|八|九)块钱'
s=re.sub(pattern,'money',s)
s
'我有money'

3)查找字符串

re.search  
扫描整个字符串并返回第一个成功的匹配  
若匹配成功, re.search()返回一个匹配的对象,否则返回None  
import re
#查找的函数
help(re.search)
Help on function search in module re:

search(pattern, string, flags=0)
    Scan through string looking for a match to the pattern, returning
    a match object, or None if no match was found.

将字符串的所有字串尝试与正则表达式匹配,如果所有的字串都没有匹配成功,返回none,否则返回a match object↑

s='这个手机才是真的666'  
re.search('666',s)
<_sre.SRE_Match object; span=(8, 11), match='666'>
if re.search('666',s):
    print('666出现在句子s中')
666出现在句子s中
if re.search('555',s) is None:
    print('555没出现在句子s中')
555没出现在句子s中
#查看匹配对象出现的位置
re.search('666',s).span()
(8, 11)
#查看匹配结果
re.search('6',s).group()
'6'

课堂作业:匹配下面句子的价格
s=‘这个机子一千五百块,我上部手机是1888元,耳机都要九十多块钱’

#课堂作业答案
s='这个机子一千五百块,我上部手机是1888元,耳机都要九十多块钱'
p1='(一|二|三|四|五|六|七|八|九|十|[0-9]{1,5}){1,2}(多?)(元|块|百|千|万)'  
re.sub(p1,'money',s)
'这个机子moneymoney块,我上部手机是money,耳机都要money钱'

课后作业:就京东评论数据进行讨论,思考需剔除和替换哪些词,并写出代码。思路参考如下↓

#step1:读取数据,并查看数据
import pandas as pd
comment_path=r'e:\京东评论数据一万条.csv'
f=open(comment_path,encoding='utf-8')
data=pd.read_csv(f)
comment=list(data['content'])
#step2:发现数据中的数字包括价格、像素、分辨率、时间……,时候需要统一化?(大家可以拓展其他方向的思路)
#step3:查看含数字的句子,这里选取前十篇评论
p='([0-9]{1,5})|(一|二|三|四|五|六|七|八|九)'
for com in comment[:10]:
    com = re.sub('\?|?|\.|,|,|\!|!', '。', com)
    for s in com.split('。'):
        if re.search(p,s):
            print(s)
第一次买vivo
1498的机子
一直使用华为手机
从荣耀七
荣耀八
荣耀九
反正一出新机就想换
一直考虑
现在手里的荣耀七
荣耀八
本来觉得双十一还会便宜的
想不到和11月初的价格差不多
我的5s也该退休了
16G的内存完全不够用
双十一买的
12号下午就到了
然后玩了一晚上
另外还有51G空间可用
2
5D屏幕
2K屏很清晰
特地用了一段时间才来评价
暂时发现的不足就是扬声器没有现在用的note2好
但是低音一般
#step4看上述句子,思考价格等的正则表达式该如何写

2、函数

#函数例子
def add_number(a,b):
    c=a+b
    d=b-a
    return c,d


m,n=add_number(a=1,b=2)

print(m)

函数的定义

def:关键字  
add_number:函数名
a、b传入函数的参数
return:返回符号,可以返回多个值(以逗号分隔)

函数的重要性

增强代码的重用性和可读性。

资料

1)参数

参数类型有:必选参数、默认参数、可变参数、关键字参数和命名关键字参数。
函数中,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

a.必选参数

def add_number(a,b):
    c=a+b
    return c
#调用函数
c=add_number(1,2)
c
3

需求来了:我想要这个函数可做加法,可做减法

def calculations(a,b,oper):
    if oper=='减法':
        c=a-b
    else:
        c=a+b
    return c
c=calculations(5,2,'减法')
c
7
c=calculations(5,2,'加法')
c
7

b.默认参数

需求来了:我经常用这个函数做加法,偶尔才用减法

def calculations(a,b,oper='加法'):
    if oper=='减法':
        c=a-b
    else:
        c=a+b
    return c
c=calculations(5,2)
c
7
#做减法
c=calculations(5,2,'减法')
c
3

注:1.设置默认参数时,必选参数在前,默认参数在后,否则Python的解释器会报错;
  2.定义默认参数要牢记:默认参数必须指向不可变对象!

c.可变参数

需求来了:我想多个数相加,但是我不确定有几个数

def calculations(number_list,oper='加法'):
    l=len(number_list)
   

    if oper=='减法':
        first=number_list[0]
        for i in range(len(number_list[:l-1])):
            first=first-number_list[i+1]
        return first

    else:
        first=number_list[0]
        for i in range(len(number_list[:l-1])):
          
            first=first+number_list[i+1]
          
        return first
#1+2+3+4=?
calculations([1,2,3,4])
10

作业:
a)构建函数 comment_data:输入:京东评论数据路径;输出:评论数据列表(一篇评论为列表的一个元素)
b)构建函数 comment_to_sentence:输入:一篇评论(comment);输出:评论划分句子后的句子列表(sentence_list)
c)构建函数 data_clean:输入:一个句子;输出:清洗后的句子
d)构建函数 sentence_to_word:输入:一个句子;输出:句子切分、去除停用词后的词组列表
e)构建函数 save_word_by_space:将上面的函数连接起来,实现所有评论的清洗、分词、保存到txt文件。注:每句话的分词结果为一行,词与词之间以空格相间

#函数示范
def comment_to_sentence(comment):
    comment = re.sub('\?|?|\.|,|,|\!|!|;', '。', comment)
    sentence_list=[]
    for c in comment.split('。'):
        sentence_list.append(c)
    return sentence_list
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值