数据分析入门

第四天 参考视频

五、Pandas使用 - 高级篇

(一)缺失值处理
  1. 如何进行缺失值处理

    (1)删除含有缺失值的样本

    (2)替换/插补

  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
    
  3. 不是缺失值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)

  4. 缺失值处理实例

(二)数据离散化
  1. 什么是数据的离散化

    连续属性的离散化就是将连续属性的值域划分为若干个离散的区间,最后用不同的符号或整数值代表落在每个子区间中的属性值。

    数据离散化的表示形式称为one-hot编码或者哑变量。

  2. 为什么要离散化

    连续属性的离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。

  3. 如何实现数据的离散化

    (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

(三)合并
  1. 按方向拼接

    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表示
    
  2. 按索引拼接

    # 准备数据
    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)
    
(四)交叉表与透视表
  1. 交叉表与透视表什么作用

    找到/探索两个变量之间的关系。

  2. 使用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可堆叠,将两个柱子叠加显示
    
  3. 使用pivot_table(透视表)实现

    # 调用透视表API
    stock.pivot_table(['pona'], index=['week']) # stock为加了pona和week两列的数据
    
(五)分组与聚合
  1. 什么是分组与聚合

    分组:按照某一个索引分组时,将该索引值相同的分成一组

    聚合:数据分组后,一般求出每组最大值作为该组代表保留,即为聚合

  2. 分组与聚合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() # 聚合
    
  3. 分组与聚合实例 - 星巴克零售店铺数据案例

    # 准备数据
    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()
    
(六)综合案例
  1. 准备数据

    # 准备数据
    movie = pd.read_csv('C:/Users/ABC/Desktop/IMDB-Movie-Data.csv')
    movie.head()
    
  2. 问题1:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?

    # 评分的平均分
    print('-------------Rating_Mean-------------')
    print( movie['Rating'].mean() )# 导演的人数
    print('-------------Director_Num-------------')
    print( np.unique(movie['Director']).size ) # 不同电影导演可能相同,所以先去重,np.unique返回ndarray,有size属性
    
  3. 问题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()
    
  4. 问题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"冷色调
    

数据分析入门-第四天相关推荐

  1. narray删除列 python_Python数据分析入门教程(四):数值操作

    作者 | CDA数据分析师 我们把菜品挑选出来以后,就可以开始切菜了.比如要做凉拌黄瓜丝,把黄瓜找出来以后,那就可以把黄瓜切成丝了. 一.数值替换 数值替换就是将数值A替换成B,可以用在异常值替换处理 ...

  2. python实现将文件内容按照某一列内容的大小值重新排序_Python数据分析入门教程(四):数值操作...

    作者 | CDA数据分析师 我们把菜品挑选出来以后,就可以开始切菜了.比如要做凉拌黄瓜丝,把黄瓜找出来以后,那就可以把黄瓜切成丝了. 一.数值替换 数值替换就是将数值A替换成B,可以用在异常值替换处理 ...

  3. 生信入门(四)——使用DESeq2进行RNA-seq数据分析

    生信入门(四)--使用DESeq2进行RNA-seq数据分析 文章目录 生信入门(四)--使用DESeq2进行RNA-seq数据分析 一.学习目标 二.实验数据 1.数据来源 2.建模计数数据 3.转 ...

  4. Python数据分析入门之pandas基础总结

    Pandas--"大熊猫"基础 Series Series: pandas的长枪(数据表中的一列或一行,观测向量,一维数组...) Series1 = pd.Series(np.r ...

  5. python 保留顺序去重_Python数据分析入门教程(二):数据预处理

    作者 | CDA数据分析师 从菜市场买来的菜,总有一些不太好的,所以把菜买回来以后要先做一遍预处理,把那些不太好的部分扔掉.现实中大部分的数据都类似于菜市场的菜品,拿到以后都要先做一次预处理. 常见的 ...

  6. 读书笔记:《谁说菜鸟不会数据分析-入门篇》第1-4章

    读书笔记:<谁说菜鸟不会数据分析-入门篇> 第一章:数据分析是神马 数据分析分类: 1.数据分析分类: 描述性数据分析:常见方法:对比分析法.平均分析法.交叉分析法 探索性数据分析–发现数 ...

  7. python数据分析入门学习笔记

    python数据分析入门学习笔记儿 学习利用python进行数据分析的笔记儿&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我 ...

  8. Python数据分析入门与实践-笔记

    第1章 实验环境的搭建 本章将主要介绍Anaconda和Jupyter Notebook.包括如何在windows,Mac,linux等平台上安装Anaconda,以及Jupyter Notebook ...

  9. Python金融数据分析入门到实战-视频课程

    大家好!很荣幸能够在CSDN上和各位同学分享这门课程. 本课程的核心为Python金融数据的分析,首先课程提取了数据分析工具NumPy.Pandas及可视化工具Matplotlib的关键点进行详细讲解 ...

  10. Python数据分析入门笔记4——数据预处理之重复值

    系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...

最新文章

  1. 【转载】解决Windows和Ubuntu时间不一致的问题
  2. linux 路由 route命令
  3. rabbitmq 取消消息_SpringBoot整合RabbitMQ实现延迟消息
  4. [LeetCode]Integer to Roman
  5. 通讯接口应用笔记3:使用W5500实现Modbus TCP服务器
  6. 华为nova9系列正式官宣:9月23日震撼上市
  7. 定义接口.定义接口成员
  8. 【Java开发】Java实现黑客帝国代码雨
  9. JAVA就业管理系统(JAVA毕业设计)
  10. gmx-MMPBSA — error while loading shared libraries: libgfortran.so.3: cannot open shared object file
  11. Java锁与线程的那些“不可描述”的事儿
  12. 【Unity主程手记(摘录)】第一章(二) - Dictory 底层源码剖析
  13. ubuntu下安装lua和luarocks
  14. 归纳偏置 (Inductive Bias)
  15. 小米手机升级后便签内容没了如何找回
  16. 推荐读书论坛--栖息谷
  17. Google - Guice 入门介绍
  18. Detecting noop updates
  19. Educoder- 《JAVA从小白到大牛》(第二章)2-3 Java面向对象 - 封装、继承和多态的综合练习
  20. 奇舞周刊第 460 期:详聊前端异常原理

热门文章

  1. 2018年系统架构设计师案例分析真题及详细答案解析
  2. mysql查询excel表_使用SQL语句实现对Excel工作表数据进行查询的方法
  3. 如何在台式电脑上添加无线网络连接服务器,台式电脑怎么无线上网?台式电脑无线网络设置教程...
  4. uniapp拍照上传照片流程笔记
  5. 微信小程序wxacode.getUnlimited 生成圆形二维码
  6. matlab自定义排序
  7. 武汉音乐学院计算机免修成绩,教务处
  8. 【Vue】实现出生日期计算年龄
  9. linux数据向量化指令,VLIW DSP编译器向量化优化技术及指令分簇算法研究
  10. 2022西工大网络安全知识竞赛赛后回顾资料