zoukankan      html  css  js  c++  java
  • pandas模块补充

    数据分析模块pandas和matplotlib补充

    • 面向百度式编程
    • 面向百度式工作

    遇到没有见过的知识点或者是相关知识点一定不要慌,结合百度和已知的知识点去学习

    pandas模块补充

    • 基于numpy构建的

    • 奠定了python数据分析领域的地位

    • 两大数据结构

      Series

      DataFrame

    • 读取和导出相关文件

    文件命名

    1.一旦软件出现了未知错误
    	有可能就是因为路径是中文的情况
        推荐你们项目文件和软件目录的命名最好都用英文
    

    简介

    基于Numpy构建
    pandas的出现,让Python语言成为使用最广泛而且强大的数据分析环境之一
    
    pandas的主要功能
    	- 具备诸多功能的两大数据结构
      	Series、DataFrame
        都是基于Numpy构建出来的
    		公司中使用频繁的是DataFrame,而Series是构成DataFrame的基础,即一个DataFrame可能由N个Series构成
    	- 集成时间序列功能
    	- 提供丰富的数学运算和操作(基于Numpy)
    	- 灵活处理缺失数据
    

    下载

    # python纯开发环境下
    pip3 install pandas
    # anaconda环境下
    conda install pandas
    '''anaconda已经自动帮助我们下载好了数据分析相关的模块,其实无需我们再下载'''
    

    导入

    import pandas as pd
    # 固定起别名的句式
    

    课程目标

    1. 掌握外部数据的读取
    2. 如何快速地认知数据的概览信息
    3. 数据子集的筛选与清洗
    4. 数据的汇总处理
    5. 数据的合并与连接
    

    数据结构之Series

    # 是一种类似于一维数组对象,由数据和相关的标签(索引)组成
    第一种:
    pd.Series([4,5,6,7,8])  
    
    第二种:
    pd.Series([4,5,6,7,8],index=['a','b','c','d','e'])
    
    第三种:
    pd.Series({"a":1,"b":2})
    
    第四种:
    pd.Series(0,index=['a','b','c'])
    

    缺失数据概念

    st = {"tony":18,"yang":19,"bella":20,"cloud":21}
    obj = pd.Series(st)
    # 定义新索引
    new_st = {'tony','yang','cloud','jason'}
    # 修改原索引
    obj1 = pd.Series(st,index=a)
    # 查看数据变化
    obj1
    
    
    小疑问:为什么运算完之后数据类型会由原来的int64变成float64?
    	因为NaN其实是float类型
    	type(np.nan) 
    	结果是:float
    

    处理缺失数据

    dropna()  # 过滤掉值为NaN的行
    fillna()  # 填充缺失数据
    isnull()  # 返回布尔数组
    notnull()  # 返回布尔数组
    
    补充:
      对数据进行处理返回一个新的结果原数据不变,如果想要直接影响原数据需要加参数inplace=True
    

    布尔选择器

    mask = pd.Series([True,False,False,True,False])
    price = pd.Series([321312,123,324,5654,645])
    price[mask]
    price|mask
    price&mask
    (price>200) & (price<900)
    price[(price>200) & (price<900)]  # 布尔求值
    

    索引

    res[1]
    res['cd']
    res.index
    
    sr = pd.Series(np.arange(10))
    sr1 = sr[3:].copy()
    sr1[1]  # 报错
    
    sr1.iloc[1]  # 以索引下标解释
    sr1.loc[3]   # 以标签解释
    

    数据操作

    res = pd.Series([...])
    res['aaa'] = 666
    res.iloc[0] = 888
    res.append(pd.Series([999],index=['cd']))
    res.set_value('cd',6969)
    del res['cd']
    

    基本算术方法

    """
    add
    sub
    div
    mul
    """
    sr1 = pd.Series([12,23,34], index=['c','a','d'])
    sr3 = pd.Series([11,20,10,14], index=['d','c','a','b'])
    sr1.add(sr3,fill_value=0)
    

    数据结构之DataFrame

    表格型数据结构,相当于一个二维数组,含有一组有序的列也可以看作是由Series组成的共用一个索引的字典
    
    第一种:
    res = pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})
    第二种:
    pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3],index=['b','a','c'])})
    第三种:
    pd.DataFrame(np.array([10,20],[30,40]),index=['a','b'],columns=['c1','c2'])
    更多
    pd.DataFrame([np.arange(1,8),np.arange(11,18)])
    s1 = pd.Series(np.arange(1,9,2))
    s2 = pd.Series(np.arange(2,10,2))
    s3 = pd.Series(np.arange(5,7),index=[1,2])
    df5 = pd.DataFrame({'c1':s1,'c2':s2,'c3':s3})
    
    """
    以上创建方式都仅仅做一个了解即可
    因为工作中dataframe的数据一般都是来自于读取外部文件数据,而不是自己手动去创建
    """
    

    常用属性及方法

    1.index    行索引
    2.columns  列索引
    3.T				 转置
    4.values   值索引
    5.describe 快速统计
    

    外部数据读取

    文本文件读取

    pd.read_csv(filepath_or_buffer, sep=‘,', header='infer', names=None, usecols=None, skiprows=None, skipfooter=None, converters=None, encoding=None)
                
    filepath_or_buffer:指定txt文件或csv文件所在的具体路径 
    sep:指定原数据集中各字段之间的分隔符,默认为逗号”,” 
          	id	 name	income
            1    jason	 10
    header:是否需要将原数据集中的第一行作为表头,默认将第一行用作字段名称 
            如果原始数据没有表头需要将该参数设置为None 
    names:如果原数据集中没有字段,可以通过该参数在数据读取时给数据框添加具体的表头 
    usecols:指定需要读取原数据集中的哪些变量名 
    skiprows:数据读取时,指定需要跳过原数据集开头的行数
             有一些表格开头是有几行文字说明的,读取的时候应该跳过
    skipfooter:数据读取时,指定需要跳过原数据集末尾的行数 
    converters:用于数据类型的转换(以字典的形式指定) 
    encoding:如果文件中含有中文,有时需要指定字符编码
    

    基本使用

    import pandas as pd
    data01 = pd.read_csv(r'data_test01.txt',
               skiprows = 2,  # python能自动过滤掉完全无内容的空行(写2、3都行)
               sep = ',',  # 默认就是逗号 写不写都行 
               skipfooter = 3, 
               )
    # 1.针对id原本是01、02自动变成了1、2...
    converters = {'id':str}
    # 2.点击文件另存修改文件编码之后再次读取出现乱码
    encoding='utf-8'
    # 3.移除收入千分位非逗号的其他符号
    thousands = '&'
    # 4.手动将文件表头行删除再次读取
    header = None  # 默认用索引
    names = ['id','year','month','day','gender','occupation','income']
    # 5.指定读取的字段
    usecols = ['id','income']
    
    """
    查看方法帮助
    方式1
    	方法名?
    方式2
    	光标停留在方法名左括号后面
    	先按住shift键不松开,再按tab键(没反应就多按几次)
    """
    

    excel表格读取

    pd.read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None, names=None,
    na_values=None, thousands=None, convert_float=True)
    
    io:指定电子表格的具体路径 
    sheetname:指定需要读取电子表格中的第几个Sheet,既可以传递整数也可以传递具体的Sheet名称 
    header:是否需要将数据集的第一行用作表头,默认为是需要的 
    skiprows:读取数据时,指定跳过的开始行数
    skip_footer:读取数据时,指定跳过的末尾行数 
    index_col:指定哪些列用作数据框的行索引(标签)
    na_values:指定原始数据中哪些特殊值代表了缺失值 
    thousands:指定原始数据集中的千分位符 
    convert_float:默认将所有的数值型字段转换为浮点型字段 
    converters:通过字典的形式,指定某些列需要转换的形式
    
    pd.read_excel(r'data_test02.xlsx',
                 header = None,
                  names = ['ID','Product','Color','Size'], 
                 converters = {'ID':str}
                 )
    

    数据库数据读取

    # 在anaconda环境下直接安装
    # pymysql模块
    import pymysql
    conn = pymysql.connect(host,port,user,password, database, charset)
    
    host:指定需要访问的MySQL服务器
    port:指定访问MySQL数据库的端口号 charset:指定读取MySQL数据库的字符集,如果数据库表中含有中文,一般可以尝试将该参数设置为 “utf8”或“gbk”
    user:指定访问MySQL数据库的用户名
    password:指定访问MySQL数据库的密码
    database:指定访问MySQL数据库的具体库名
      
    # 利用pymysql创建好链接MySQL的链接之后即可通过该链接操作MySQL
    pd.read_sql('select * from user', con = conn)
    conn.close()  # 关闭链接
    

    数据概览

    df.columns  # 查看列 
    df.index  # 查看行
    df.shape	# 行列 
    df.dtypes  # 数据类型 
    df.describe  # 统计描述
    	默认只会统计数字类型的数据,非数字类型统计需要加参数include
      sec_buildings.describe(include='object')
    df.head()  # 取头部多条数据
    df.tail()  # 取尾部多条数据
    

    行列操作

    df.rename(column={'旧列名称':'新列名称'},inplace=True)
    # 能修改 但是会报个错误 可以添加下列配置
    pd.set_option('mode.chained_assignment',None)
    
    # 创建新的列
    df['新列名称']=df.列名称/(df.列名称1+df.列名称2)
    # 自定义位置
    df.insert(3,'新列名称',新数据)
    
    # 添加行
    df3 = df1.append(df2)
    

    数据筛选

    # 获取指定列数据
    df['列名']
    df[['列名1','列名2',...]]
    
    # 获取指定行数据
    sec_buildings.loc[sec_buildings["region"] == '浦东',:]
    
    sec_buildings.loc[(sec_buildings["region"] == '浦东') & (sec_buildings['size'] > 150),:]
    
    sec_buildings.loc[(sec_buildings["region"] == '浦东') & (sec_buildings['size'] > 150),['name','tot_amt','price_unit']]
    """知识回顾:逻辑运算符链接条件 条件最好用括号括起来"""
    

    数据处理

    sec_car = pd.read_csv(r'sec_cars.csv')
    sec_car.head()
    sec_car.dtypes
    sec_car.Boarding_time = pd.to_datetime(sec_car.Boarding_time, format = '%Y年%m月')
    sec_car.New_price = sec_car.New_price.str[:-1].astype(float)
    
    
    data = pd.read_excel(r'data_test04.xlsx')
    data.head()
    data.duplicated()  # 判断是否有重复行
    	如果想单独判断某列是否有重复需要加参数subset
    data.drop_duplicates(inplace= True)
    

    异常值识别与处理

    异常值的识别与处理
    1. Z得分法
    2. 分位数法
    3. 距离法
    

    缺失值处理

    缺失值的识别与处理
    1. df.isnull 
    2. df.fillna
    3. df.dropna
    
    data05 = pd.read_excel(r'data_test05.xlsx')
    data05.head()
    data05.isnull()  # 统计每个数据项是否有缺失
    data05.isnull().any(axis = 0)  # 统计列字段下是否含有缺失
    # 计算各列数据的缺失比例
    data05.isnull().sum(axis = 0)/data05.shape[0]
    data05.dropna()
    
    data05.fillna(value=0)  # 将所有的缺失值填充为0(不合理)
    # 针对不同的缺失值使用合理的填充手段
    data05.fillna(value = {
      'gender':data05.gender.mode()[0],  # 众数:可以有一个也可能是多个
      'age':data05.age.mean(),  # 平均值
      'income':data05.income.median()  # 中位数
    }, inplace = True)
    
    为了舒适的结果,眼前的坎坷路程即使再长都是值得的。
  • 相关阅读:
    JS 打印实现部分打印
    window.opener和window.open
    js中!和!!的区别及用法
    SQL循环表里的数据
    简明lua教程[转]
    mysql调优技巧-profiles
    MySQL的InnoDB的幻读问题
    linux exec命令
    常用正则搜集整理
    flashget for linux安装问题解决
  • 原文地址:https://www.cnblogs.com/abudrSatan1998/p/13844129.html
Copyright © 2011-2022 走看看