Python-pandas{文本数据处理}

  博客文章内需要的文件: 文件

 pandas学习路线:

Python-Pandas{数据结构与基本功能
Python-Pandas{描述与统计功能}
Python-pandas{缺失值处理}
Python-pandas{文本数据处理}
Python-pandas{数据分组}

 &emsop;学习之前先导入3个样本,都在上方的链接里

import numpy as np
import pandas as pd
grade = pd.read_csv("student_grade.txt",sep='\t')
wine = pd.read_csv("wine.csv",sep=',')
imdb = pd.read_csv('imdb_1000.csv')

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

文本数据处理

str属性

  Series中可以字符串相关的方法,封装在str子模块下面

插入内容

  replace: 是Pandas本身的替换功能

grade.replace('王雪','张三')

在这里插入图片描述

# 用字典一次性替换多个
grade.replace({'王雪':'张三', '韩林霖':'赵四'})

在这里插入图片描述

# 不过 我们发现了,replace 方法 有一个小bug就是只能 整体替换,比如说 在姓名列,只能替换整个姓名,不能做到在姓名中只替换姓,而不替换名。
# 这种情况下,我们只有运用到 str子模块


# 对比, str 功能下面的替换
t = grade.姓名.str
t.replace('王','🤙')

'''
0      杨璐
1      🤙雪
2     韩林霖
3     沙龙逸
4     李鉴学
     ... 
'''


# 其他子模块str的方法
# 统计这个班级有多少个2个字的,3个字的
grade['姓名长度'] = grade.姓名.str.len()
grade.姓名长度.value_counts()
'''
3    51
2    15
4     2
Name: 姓名长度, dtype: int64
'''
grade[grade.姓名长度 == 4]

在这里插入图片描述
和 python 原生字符串区别不大的方法

  1. len
  2. lower
  3. upper
  4. islower
  5. isupper
  6. find
  7. count
  8. strip
  9. split
imdb.title.str.upper()
'''
0                             THE SHAWSHANK REDEMPTION
1                                        THE GODFATHER
2                               THE GODFATHER: PART II
3                                      THE DARK KNIGHT
4                                         PULP FICTION
                            ...                       
974                                            TOOTSIE
975                        BACK TO THE FUTURE PART III
976    MASTER AND COMMANDER: THE FAR SIDE OF THE WORLD
977                                        POLTERGEIST
978                                        WALL STREET
Name: title, Length: 979, dtype: object
'''

# 统计标题内有多少个The
imdb.title.str.count('The')

'''
0      1
1      1
2      1
3      1
4      0
      ..
974    0
975    0
976    1
977    0
978    0
Name: title, Length: 979, dtype: int64
'''

wine数据练习题

  1. 把品牌中的红,替换成黑
wine.品牌.str.replace('红','黑')
  1. 统计商品名称中"酒" 这个字都出现了多少次,并统计各次数出现的值
wine['酒次数'] = wine.商品名称.str.count('酒') 
wine.酒次数.value_counts()
  1. 提取出日期中的年,月,日 并拆分成三列
wine[['年','月','日']] =  wine.日期.str.split('/', expand=True)
# expand 参数为True时返回列
wine

在这里插入图片描述
提取出天猫超市卖的酒
5. 提取出所有郎酒
6. 提取出所有二锅头

高级方法

  • contains 包含 : 判断字符串中是否包含某个自字符
# 既然是判断,所以返回值就是Ture和False

# 提取出天猫超市卖的酒
wine.商品名称.str.contains('天猫超市')
'''
0      False
1      False
2      False
3      False
4      False
       ...  
'''
# 过滤一下
wine[wine.商品名称.str.contains('天猫超市')]

在这里插入图片描述

  • startswith :判断是否以子串开始
# 提取出姓名中包含王的数据
grade[grade.姓名.str.contains('王')]


# 但是contains有一个小bug,比如说
# 修改一下人名
grade.loc[2,'姓名'] = '韩林王'
grade[grade.姓名.str.contains('王')]
# 大家运行会发现,韩林王也被提取出来了,也就是说,contains,只要包含该字符就会被提取出来



#  提取出 '王'姓 的名字
#  提取出第一个字是王的
grade[grade.姓名.str.startswith('王')]
  • endswith : 判断是否以子串结束
grade[grade.姓名.str.endswith('月')]

其他方法

# get方法
wine.商品名称.str.get(0)  # 得到第n个字符,从0开始计算


# 从索引为1切到最后
grade.姓名.str.slice(1)


# slice 进行截取
wine.商品名称.str.slice(0,3)


# slice_replace 对元素进行切片替换
wine.商品名称.str.slice_replace(0,3,'你好')


# cat 对字符串进行连接
grade.姓名.str.cat(sep=', ')


# 连接成字符串
grade.姓名.str.cat(sep=',')


# repeat 
imdb.genre.str.repeat(4)
# 把每个元素重复 n 次
grade.姓名.str.repeat(2)


grade.姓名.str.join(' ')

练习

  1. 将imdb当中star_rating, 拆分成整数列 和小数列, 中间的点 不要了
imdb[['整数','小数']] =  imdb.star_rating.astype('str').str.split('.', expand=True)


# 也可以这样写
imdb['整数'] = imdb.star_rating.astype('str').str.get(0)
imdb['小数'] = imdb.star_rating.astype('str').str.get(2)
  1. 将imdb数据title中的标题,连接成没有空格的字符串
imdb['title'] = imdb.title.str.replace(' ','')
  1. 将imdb数据中genre这一列的所有字母改成大写字母
imdb['genre'] = imdb.genre.str.upper()
  1. 找出广告词中含有领券的商品
# 广告词部分有空值,需要填充为空后才可以进行过滤
wine[wine.广告词.str.contains('领券').fillna(False)]
  1. 找出wine数据中ID中含有3个以上数字8的商品
wine[wine.ID.astype('str').str.count('8') >= 3]

哑变量

  哑变量/独热编码(对数据的编码方式)

  通过 get_dummies 方法可以将字符串转为哑变量,sep 参数是指定哑变量之间的分隔符。来看看效果吧。

  首先

grade_new = grade.head(7).copy()
grade_new

在这里插入图片描述

 假如我们现在由这样一列数据
 杨璐, A型;王雪, B 型;韩林霖,O 型 ;沙龙逸,A 型;李鉴学,O 型; 韩雨萌,A 型;刘帅,AB 型

grade_new['血型'] = ['A','B','O','A','O','A','AB']
grade_new

在这里插入图片描述

grade_new.血型.replace({"A":0,'B':1,'O':2,"AB":3},inplace=True)
grade_new

在这里插入图片描述
  以上我们使用数字进行映射血型,但是有一小问题,数字表示0,1,2,3这样其实潜意识进行了排序,因为python内会认为数字本身就有大小,这样对以后的操作是不便的,而血型是不分大小的,这样的情况下就会用到哑变量,什么是哑变量呢,其实大家可以理解用 1行n列的表格来表示一个属性,表格内只有0和1。就比如说

姓名ABABO
杨 璐1000
王 雪0100
韩林霖0001
沙龙逸1000
李鉴学0001
韩雨萌1000
刘 帅0010

  因为根据其中任意三列,可以得到剩下一列的值,所以可以去掉其中的一列数据

姓名ABAB
杨 璐100
王 雪010
韩林霖000
沙龙逸100
李鉴学000
韩雨萌100
刘 帅001

  那我们如何创建哑变量呢?使用 get_dummies 方法

content_rating = imdb.content_rating.str
content_rating.get_dummies()# 哑变量

在这里插入图片描述

# 去掉最后一列
dummy = content_rating.get_dummies().iloc[:, :-1]
# pd.concat # 拼接会原来的数据
imdb_new = pd.concat([imdb, dummy] , axis=1 )
# 把刚才做哑变量的这一列删除掉
imdb_new.pop('content_rating')
imdb_new

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值