博客文章内需要的文件: 文件
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 原生字符串区别不大的方法
- len
- lower
- upper
- islower
- isupper
- find
- count
- strip
- 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数据练习题
- 把品牌中的红,替换成黑
wine.品牌.str.replace('红','黑')
- 统计商品名称中"酒" 这个字都出现了多少次,并统计各次数出现的值
wine['酒次数'] = wine.商品名称.str.count('酒')
wine.酒次数.value_counts()
- 提取出日期中的年,月,日 并拆分成三列
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(' ')
练习
- 将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)
- 将imdb数据title中的标题,连接成没有空格的字符串
imdb['title'] = imdb.title.str.replace(' ','')
- 将imdb数据中genre这一列的所有字母改成大写字母
imdb['genre'] = imdb.genre.str.upper()
- 找出广告词中含有领券的商品
# 广告词部分有空值,需要填充为空后才可以进行过滤
wine[wine.广告词.str.contains('领券').fillna(False)]
- 找出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。就比如说
姓名 | A | B | AB | O |
---|---|---|---|---|
杨 璐 | 1 | 0 | 0 | 0 |
王 雪 | 0 | 1 | 0 | 0 |
韩林霖 | 0 | 0 | 0 | 1 |
沙龙逸 | 1 | 0 | 0 | 0 |
李鉴学 | 0 | 0 | 0 | 1 |
韩雨萌 | 1 | 0 | 0 | 0 |
刘 帅 | 0 | 0 | 1 | 0 |
因为根据其中任意三列,可以得到剩下一列的值,所以可以去掉其中的一列数据
姓名 | A | B | AB |
---|---|---|---|
杨 璐 | 1 | 0 | 0 |
王 雪 | 0 | 1 | 0 |
韩林霖 | 0 | 0 | 0 |
沙龙逸 | 1 | 0 | 0 |
李鉴学 | 0 | 0 | 0 |
韩雨萌 | 1 | 0 | 0 |
刘 帅 | 0 | 0 | 1 |
那我们如何创建哑变量呢?使用 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