【问题一】 str对象方法和df/Series对象方法有什么区别?
str.replace针对的是object类型或string类型,默认是以正则表达式为操作,目前暂时不支持DataFrame上使用
.replace针对的是任意类型的序列或数据框,如果要以正则表达式替换,需要设置regex=True,该方法通过字典可支持多列替换
【问题二】 给出一列string类型,如何判断单元格是否是数值型数据?
无论是isnumeric, isdigit以及 isdecimal等只能判断纯数字字符,不能带小数点,负号等标点符号. 如果需要判断是否单元格是否为数值类型, 可以使用正则表达式进行匹配. str.match(r’^-?(\d+)(.\d+)?$’,na = False), 当然这也不是完备的,比如科学计数法就无法匹配了
【问题三】 rsplit方法的作用是什么?它在什么场合下适用?
rsplit 只能作用在字符上, 因此列表等对象无法使用, 如果对列表使用, 一般可配合apply.
【问题四】 在本章的第二到第四节分别介绍了字符串类型的5类操作,请思考它们各自应用于什么场景?
习题1
第一问属于常规操作了, 就是注意把数值转成字符再拼接
xt1 = pd.read_csv(‘data/String_data_one.csv’,index_col=‘人员编号’)
xt1[‘ID’] = xt1.apply(lambda x: x.姓名+’:’+str(x.国籍) + ‘国人,’+‘性别’ + x.性别+’,生于’+str(x.出生年)+‘年’+str(x.出生月)+‘月’+str(x.出生日)+‘日’, axis = 1)
第二问:
x_dict = {1:‘一’,2:‘二’,3:‘三’,4:‘四’,5:‘五’,6:‘六’,7:‘七’,8:‘八’,9:‘九’,0:‘零’}
xt1[‘出生年’] = xt1[‘出生年’].astype(‘str’).astype(‘string’).str.replace(r’\d’, lambda x: x_dict[int(x.group(0))])
如此类推, 原谅想的比较简单粗暴, 没考虑日,月出现两位数的情形
第三问:
主要考察的是extract的用法了, 不会的话还真的很麻烦, 大佬的答案值得反复学习.
习题二:
看了大佬的答案, 用到 [北京]{2} 意思是前面两个字符, 匹配两次, 但细扣的话, 如果有北北, 京京, 京北, 这些组合也会被匹配出来, 比如如果新闻标题有 海上, 则[上海]{2}则会匹配出来, 此处感谢闫老师的思考.
于是,我用下面的:
xt2[xt2[‘col1’].str.contains(r’(北京|上海)’)]
问题2,3, 用到前面的数值匹配
str.match(r’^-?(\d+)(.\d+)?$’,na = False)
通过反选, 把匹配不成功的提取出来, 逐个修改
然后整列通过astype(‘int’), astype
(‘float’) 进行转换成数值, 在求mean
done