数据分析入门-第四天
数据分析入门
第四天 参考视频
五、Pandas使用 - 高级篇
(一)缺失值处理
如何进行缺失值处理
(1)删除含有缺失值的样本
(2)替换/插补
如何处理nan
(1)判断数据中是否存在NaN
movies = pd.read_csv('C:/Users/ABC/Desktop/IMDB-Movie-Data.csv')# pd.notnull(movies) # 与下面一句相反,不是缺失值的元素,在其位置显示True;否则显示False pd.isnull(movies) # 是缺失值的元素,在其位置显示True;否则显示False# np.all(pd.notnull(movies)) # 如果有一个False则显示False,表明有缺失值 np.any(pd.isnull(movies)) # 如果有一个True则显示True,表明有缺失值
# pd.notnull(movies).all() # 为False的字段表示有缺失值 pd.isnull(movies).any() # 为True的字段表示有缺失值 ''' Rank False Title False Genre False Description False Director False Actors False Year False Runtime (Minutes) False Rating False Votes False Revenue (Millions) True Metascore True dtype: bool '''
(2)删除含有缺失值的样本
movies.dropna() # axis=0,inplace=False(为True在原有数据修改),返回一个删除Nan项(一行)的DataFrame,不修改原DataFrame pd.notnull(movies.dropna()).all() # 全True
(3)替换/插补含有缺失值的样本
# 1.替换哪些列数据 # Revenue (Millions) False # Metascore False # 2.用什么值替换 - 此处用平均值 movies['Revenue (Millions)'].fillna(movies['Revenue (Millions)'].mean(),inplace=True) movies['Metascore'].fillna(movies['Metascore'].mean(),inplace=True) # inplace为True在原有数据修改 pd.notnull(movies).all() # 全True
不是缺失值nan,有默认标记的
(1)替换 ?-> np.nan
# 读取数据 path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data" name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape', 'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli', 'Mitoses', 'Class'] data = pd.read_csv(path, names=name)# 替换?->np.nan data_new = data.replace( to_replace='?', value=np.nan)# 处理np.nan缺失值 data_new.dropna(inplace=True) pd.notnull(data_new).all() # 全True
(2)处理np.nan缺失值的步骤,见2的(2)、(3)
缺失值处理实例
(二)数据离散化
什么是数据的离散化
连续属性的离散化就是将连续属性的值域划分为若干个离散的区间,最后用不同的符号或整数值代表落在每个子区间中的属性值。
数据离散化的表示形式称为one-hot编码或者哑变量。
为什么要离散化
连续属性的离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。
如何实现数据的离散化
(1)分组
# 准备数据 data = pd.Series([165,174,160,180,159,163,192,184],index=["No1:165","No2:174","No3:160","No4:180","No5:159","No6:163","No7:192","No8:184"]) data
# 1.自动分组 sr=pd.qcut(data, bins) # bins表示分成几组,返回一个series变量 sr = pd.qcut(data,3) # 统计每个区间有多少人 sr.value_counts()# 2.转换成one-hot编码 pd.get_dummies(sr, prefix='height') # prefix给每个分组加的前缀
# A.自定义分组 sr=pd.cut(data, []) # []想要分组的边界值组成的列表 myBins = [150,165,180,195] # 想要分组的边界值 (150,165] (165,180] (180,195] sr = pd.cut(data, bins=myBins) # 这样写也可以sr = pd.cut(data, myBins) sr.value_counts()# B.转换成one-hot编码 pd.get_dummies(sr, prefix='height') # prefix给每个分组加的前缀
(2)将分组好的结果转换成one-hot编码/哑变量,见上面的2和B
(三)合并
按方向拼接
pd.concat([a, b], axis=1) # axis=1,将a、b水平拼接,列合并pd.concat([a, b], axis=0) # axis=0,将a、b竖直拼接,行合并,索引不一致时,将a、b的索引合并,原a/b中没有的项用Nan表示
按索引拼接
# 准备数据 left=pd.DataFrame({'key1':['K0','K0','K1','K2'], 'key2':['K0','K1','K0','K1'], 'A':['A0','A1','A2','A3'], 'B':['B0','B1','B2','B3']}) print('--------left--------') print(left)right=pd.DataFrame({'key1':['K0','K1','K1','K2'], 'key2':['K0','K0','K0','K0'], 'C':['Co','C1','C2','C3'],'D':['DO','D1','D2','D3']}) print('--------right--------') print(right)
# inner ,默认内连接 # inner 保留共有的key result_inner = pd.merge(left, right, on=['key1','key2'], how='inner') print('-------------inner-------------') print(result_inner)# left ,左连接 # 左表中所有的key都保留,以左表为主进行合并 result_left = pd.merge(left,right,on=['key1','key2'],how="left") print('-------------left-------------') print(result_left)# right ,右连接 # 右表中所有的key都保留,以右表为主进行合并 result_right = pd.merge(left,right,on=['key1','key2'],how="right") print('-------------right-------------') print(result_right)# outer ,外连接 # 左右两表中所有的key都保留,进行合并 result_outer = pd.merge(left,right,on=['key1','key2'],how="outer") print('-------------outer-------------') print(result_outer)
(四)交叉表与透视表
交叉表与透视表什么作用
找到/探索两个变量之间的关系。
使用crosstab(交叉表)实现
# 准备数据 stock = pd.read_csv('C:/Users/ABC/Desktop/stock_day.csv')# 准备日期数据 stock.index # 行索引,日期 date = pd.to_datetime(stock.index) date.weekday # 行索引日期转化为星期几 stock['week'] = date.weekday stock # 添加week列到stock_primary中# 准备涨跌幅数据 stock['pona'] = np.where(stock['p_change']>0, 1, 0) # stock['p_change']>0的为1,否则为0stock
# 调用交叉表API stock_cross = pd.crosstab(stock['week'], stock['pona']) stock_cross_sum = stock_cross.sum(axis=1) # axis=1,按列求和 将所得到的pona为0和1的两列求和,用于求频率 stock_cross_process = stock_cross.div(stock_cross_sum,axis=0) # axis=0按行做除法 stock_cross_process.plot(kind='bar',stacked=True) # stacked可堆叠,将两个柱子叠加显示
使用pivot_table(透视表)实现
# 调用透视表API stock.pivot_table(['pona'], index=['week']) # stock为加了pona和week两列的数据
(五)分组与聚合
什么是分组与聚合
分组:按照某一个索引分组时,将该索引值相同的分成一组
聚合:数据分组后,一般求出每组最大值作为该组代表保留,即为聚合
分组与聚合API
# 准备数据 col = pd.DataFrame({'color':['white','red','green','red','green'],'object':["pen","pencil","pencil","ashtray","pen"],'price1':[4.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.68,0.75,3.15]}) col
# 进行分组,对颜色进行分组,对价格price1进行聚合# 用DataFrame的方法进行分组聚合 col.groupby(by="color")["price1"].max() # 分组后并不会直接出结果,所以又对price1聚合# 用Series的方法进行分组 col['price1'].groupby(col["color"]) # 先找到price1的series,然后根据color的series分组,同样分组后并不会直接出结果 col['price1'].groupby(col["color"]).max() # 聚合
分组与聚合实例 - 星巴克零售店铺数据案例
# 准备数据 starbucks = pd.read_csv('C:/Users/ABC/Desktop/directory.csv') starbucks.head()
# 按国家分组,求出每个国家星巴克店铺数量 starbucks.groupby(by='Country').count()# 分组后,每一列其实都可以代表店铺数量,此处就取brand列 # 对分组后数据降序排序,取前十个画出柱状图 starbucks.groupby(by='Country').count()['Brand'].sort_values(ascending=False)[:10].plot(kind='bar', figsize=(20,8), fontsize=20)
# 先按国家分组,再按省市分组 starbucks.groupby(by=['Country','State/Province']).count()
(六)综合案例
准备数据
# 准备数据 movie = pd.read_csv('C:/Users/ABC/Desktop/IMDB-Movie-Data.csv') movie.head()
问题1:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?
# 评分的平均分 print('-------------Rating_Mean-------------') print( movie['Rating'].mean() )# 导演的人数 print('-------------Director_Num-------------') print( np.unique(movie['Director']).size ) # 不同电影导演可能相同,所以先去重,np.unique返回ndarray,有size属性
问题2:对于这一组电影数据,如果我们先rating,runtime的分布情况,应该如何呈现数据?
# 问题2:对于这一组电影数据,如果我们先rating,runtime的分布情况,应该如何呈现数据?# 1.创建画布 plt.figure(figsize=(20,8), dpi=80)# 2,绘制直方图 plt.hist(movie['Rating'], 20) # 修改刻度 plt.xticks(np.linspace(movie['Rating'].min(), movie['Rating'].max(), 21)) # linspace左闭右闭,21个点分20段 # 添加网格 plt.grid(linestyle='--', alpha=0.5)# 3.显示图像 plt.show()
问题3:对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?
# 问题3:对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?# 先统计电影类别有哪些 movie_genre_first = [i for i in movie['Genre']] movie_genre_first # 数据样式['Action,Adventure,Sci-Fi','Adventure,Mystery,Sci-Fi','Horror,Thriller']movie_genre_second = [i.split(',') for i in movie['Genre']] movie_genre_second # 数据样式[['Action', 'Adventure', 'Sci-Fi'],['Adventure', 'Mystery', 'Sci-Fi'],['Horror', 'Thriller']]movie_genre_third = [j for i in movie_genre_second for j in i] movie_genre_third #数据样式['Action','Adventure','Sci-Fi','Adventure','Mystery','Sci-Fi','Horror','Thriller']movie_class = np.unique(movie_genre_third) movie_class
# 统计每个类别有几个电影# 先建立一个1000*20的空表(总共1000部电影,20个分类) count = pd.DataFrame(np.zeros(shape=(1000,20), dtype='int32'), columns=movie_class)movie_genre_second movie_genre_second[0] # Results:['Action', 'Adventure', 'Sci-Fi']
# 计数填表 for i in range(1000):count.loc[i,movie_genre_second[i]] = 1 # i=0时count.loc[0,['Action', 'Adventure', 'Sci-Fi']],索引到第0行这三列对应的三个元素,都赋值为1 count # 此时count每一行,有该电影分类时元素值为1count.sum(axis=0) # 按列求和,即得电影每个分类数量count.sum(axis=0).sort_values(ascending=False).plot(kind='bar', fontsize=20, figsize=(20,9), colormap="cool") # colormap="cool"冷色调
数据分析入门-第四天相关推荐
- narray删除列 python_Python数据分析入门教程(四):数值操作
作者 | CDA数据分析师 我们把菜品挑选出来以后,就可以开始切菜了.比如要做凉拌黄瓜丝,把黄瓜找出来以后,那就可以把黄瓜切成丝了. 一.数值替换 数值替换就是将数值A替换成B,可以用在异常值替换处理 ...
- python实现将文件内容按照某一列内容的大小值重新排序_Python数据分析入门教程(四):数值操作...
作者 | CDA数据分析师 我们把菜品挑选出来以后,就可以开始切菜了.比如要做凉拌黄瓜丝,把黄瓜找出来以后,那就可以把黄瓜切成丝了. 一.数值替换 数值替换就是将数值A替换成B,可以用在异常值替换处理 ...
- 生信入门(四)——使用DESeq2进行RNA-seq数据分析
生信入门(四)--使用DESeq2进行RNA-seq数据分析 文章目录 生信入门(四)--使用DESeq2进行RNA-seq数据分析 一.学习目标 二.实验数据 1.数据来源 2.建模计数数据 3.转 ...
- Python数据分析入门之pandas基础总结
Pandas--"大熊猫"基础 Series Series: pandas的长枪(数据表中的一列或一行,观测向量,一维数组...) Series1 = pd.Series(np.r ...
- python 保留顺序去重_Python数据分析入门教程(二):数据预处理
作者 | CDA数据分析师 从菜市场买来的菜,总有一些不太好的,所以把菜买回来以后要先做一遍预处理,把那些不太好的部分扔掉.现实中大部分的数据都类似于菜市场的菜品,拿到以后都要先做一次预处理. 常见的 ...
- 读书笔记:《谁说菜鸟不会数据分析-入门篇》第1-4章
读书笔记:<谁说菜鸟不会数据分析-入门篇> 第一章:数据分析是神马 数据分析分类: 1.数据分析分类: 描述性数据分析:常见方法:对比分析法.平均分析法.交叉分析法 探索性数据分析–发现数 ...
- python数据分析入门学习笔记
python数据分析入门学习笔记儿 学习利用python进行数据分析的笔记儿&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我 ...
- Python数据分析入门与实践-笔记
第1章 实验环境的搭建 本章将主要介绍Anaconda和Jupyter Notebook.包括如何在windows,Mac,linux等平台上安装Anaconda,以及Jupyter Notebook ...
- Python金融数据分析入门到实战-视频课程
大家好!很荣幸能够在CSDN上和各位同学分享这门课程. 本课程的核心为Python金融数据的分析,首先课程提取了数据分析工具NumPy.Pandas及可视化工具Matplotlib的关键点进行详细讲解 ...
- Python数据分析入门笔记4——数据预处理之重复值
系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...
最新文章
- 【转载】解决Windows和Ubuntu时间不一致的问题
- linux 路由 route命令
- rabbitmq 取消消息_SpringBoot整合RabbitMQ实现延迟消息
- [LeetCode]Integer to Roman
- 通讯接口应用笔记3:使用W5500实现Modbus TCP服务器
- 华为nova9系列正式官宣:9月23日震撼上市
- 定义接口.定义接口成员
- 【Java开发】Java实现黑客帝国代码雨
- JAVA就业管理系统(JAVA毕业设计)
- gmx-MMPBSA — error while loading shared libraries: libgfortran.so.3: cannot open shared object file
- Java锁与线程的那些“不可描述”的事儿
- 【Unity主程手记(摘录)】第一章(二) - Dictory 底层源码剖析
- ubuntu下安装lua和luarocks
- 归纳偏置 (Inductive Bias)
- 小米手机升级后便签内容没了如何找回
- 推荐读书论坛--栖息谷
- Google - Guice 入门介绍
- Detecting noop updates
- Educoder- 《JAVA从小白到大牛》(第二章)2-3 Java面向对象 - 封装、继承和多态的综合练习
- 奇舞周刊第 460 期:详聊前端异常原理
热门文章
- 2018年系统架构设计师案例分析真题及详细答案解析
- mysql查询excel表_使用SQL语句实现对Excel工作表数据进行查询的方法
- 如何在台式电脑上添加无线网络连接服务器,台式电脑怎么无线上网?台式电脑无线网络设置教程...
- uniapp拍照上传照片流程笔记
- 微信小程序wxacode.getUnlimited 生成圆形二维码
- matlab自定义排序
- 武汉音乐学院计算机免修成绩,教务处
- 【Vue】实现出生日期计算年龄
- linux数据向量化指令,VLIW DSP编译器向量化优化技术及指令分簇算法研究
- 2022西工大网络安全知识竞赛赛后回顾资料