• python数据处理 2


    chapter2 数据处理

    1. Anaconda:

    1.1 安装

    2.Numpy

    Numpy的数据结构是n维数组对象,叫做ndarray.

    import numpy as np
    data1=[1,2,3,4]
    array1 = np.array(data1)# 将数据转化为n维的numpy的数据结构
    data2 = [[1,3,4],[2.5,6]]
    array2 = np.array(data2)
    print(array2)
    print(array2.astype("str")) #将数据元素的类型转换,使用astype
    print(array1*aray1) # 数组间的计算不必去循环操作,这种乘法是每个元素去执行
    print(array1[0][1]) # 可以了类比php多维数组访问的方式 
    

    3. Pandas

    Pandas(panel data 面板数据)是python的一个数据分析包

    3.1 panda的数据结构:

    1. Series: 一维数组

    2. DataFrame: 二维数组

    3. Pannel: 三维数组

    4.数据准备

    4.1 常用数据类型

    4.1.1. Logical 逻辑型

    逻辑型也就是布尔类型,True False

    4.1.2 Numeric数值型:

    4.1.3 character 字符型:

    4.2 数据结构

    Pandas中主要使用的是Series,DataFrame两种数据结构

    4.2.1 Series

    Series 用于存储一行或者一列的数据,以及与之相关的索引的集合

    Series(['数据1','数据2'],index=[索引1,索引2])
    
    from pandas import Series
    x = Series(['a',2,"螃蟹"],index=[1,2,3])
    print(x[3])
    

    Series可以存放多种数据类型.索引默认从0开始

    from Pandas import Series
    x = Series([1,2,3])
    print(x) #打印出来第一列是索引,第二列是数值
    

    常见操作已经错误如下:

    from pandas import Series
    x = Series(['a',True,1],index=['first','second','third'])
    n= Series(['2'])
    a = x.append(n) #通过这种形式对一个series进行追加
    print(2 in a.values) #判断数值2是否在值里面
    print("2" in a.values)# 判断字符串2是否在值里面
    print(a[1:2]) #series 进行切片,左开右闭
    b = a.drop(0) #根据索引号删除数据
    print(b)
    c= a.drop("first") #根据索引名删除
    print(c)
    #a.drop(a.index["secod"]) #这种情况是,使用index里面的是index的序号
    
    series = Series([1,3,4,5],index=['d','a','c','f'])
    print(series)
    obj = series.reindex(['a','b','c','f']); # 指定顺序进行排序
    print(obj)
    

    4.2.2 DataFrame

    DataFrame 用于存储多行多列的数据集合,是Series的父集.类似于excel,水平和竖直两个维度

    简单示例:

    from pandas import Series
    from pandas import DataFrame
    df = DataFrame({'age':Series([26,27,28]),"name": Series(["张三","李四","王五"])},index=[0,1,2]) #注意,第一个是Series的字典,所以他们是用{}括起来的  index是可以省略的
    print(df[1:2]) #切片 打印第2条记录
    print(df.iloc[0:2,0:2]) # 获取数据块元素, 第一个是行,第二个是列,第[0,2)行,第[0,2)列,注意这里不是小括号,是中括号
    d = df.at[0,'name'] #获取第0 行和 'name'列的交叉点,这个是点,上面那个是块
    print(d)
    
    

    DataFrame的增删改查操作

    from pandas import Series
    from pandas import DataFrame
    df1 = DataFrame({'age':[21,22,23],'name':['张三','李四','王五']})
    df2 = DataFrame(data={'age':[21,22,23],'name':['张三','李四','王五']},index=["first","second","third"])
    #访问行
    print(df1[1:100]) #方位索引[1-100) 的元素
    print(df2["third":"second"]) # 索引大于third的索引(2),并且小于second(1)的索引. 空数据
    print(df2["third":"third"])
    print(df2["third":"second"]) #为空,
    
    #访问列
    print(df1["age"]) #直接填入列明,查询列数据
    print(df1[df1.columns[0:1]]) #通过列号索引获取列名称df.columns[0:1]
    print(df1.iloc[0:1,0:1]) #访问列快
    print(df1.at[1,'name']) #访问某一个点, 第1行,name列的交叉点
    
    #修改列名称
    df1.columns=['age2','name2'] #更上面获取列明的进行对比,注意这里是等号
    print(df1)
    
    #修改行索引
    df1.index = range(1,4)
    
    #根据行索引进行删除
    df1.drop(1,axis=0) #axis=0 标识行,可以省略不写
    
    e = df1.drop(1) #drop 语句并不会删除原来的变量,会将删除后的数据返回.
    print(df1)
    print(e)
    
    f = df1.drop('age2',axis=1) # axis=0 标识行 axis=1标识列
    print(df1)
    print(f)
    
    #对原数据进行删除操作的
    del df1['age2']
    print(df2)
    
    #增加列
    df1["newColumns"] = [2,3,5] #直接对源数据进行修改
    print(df1)
    #增加行
    #增加行可以通过两个DataFrame合并来解决:
    df3 = DataFrame([[1,2],[7,8]],columns=list("AB"))
    print(df3)
    df4 = DataFrame([[56,23],[2323,33]],columns=list("AB"))
    print(df4)
    g = df3.append(df4) #仅做简单的追加,index各自保持原来的,同时append不会对源数据进行改变,会返回新的df对象
    print(g)
    h = df3.append(df4,ignore_index=true)# 这种是重新指定的索引的方法
    

    4.3 数据导入

    在pandas中数据导入,常用的函数是read_csv,read_excel,read_table,read_sql.

    4.3.1 txt导入

    read_table 用于读取txt文件.命令格式如下:

    read_table(file,name=[列名称1,列名称2,..],sep="")
    
    • file 文件路径,文件名
    • name 为名称
    • sep为分隔符,默认为空
    from pandas import read_table
    df = read_table(r'E:data_temp
    ead_table.txt');
    print(df.head())
    

    r标识不转义后面的斜线

    4.3.2 csv文件导入

    read_csv 函数可以导入csv文件:

    用法:

    read_csv(file,name=[列名称1,列名称2,..],sep="")
    

    示例:

    from pandas import read_table
    from pandas import read_csv
    df1 = read_csv(r'E:data_temp
    ead_csv.csv')
    print(df1)
    

    需要注意的是,csv文件的编码个是 要与python文本的格式保持一致

    4.3.3 excel文件导入

    read_excel 函数导入excel文件:

    用法:

    read_excel(file,name=[列名称1,列名称2,..],sheet_name,header=0)
    

    header =0 标识第一行作为表头显示,header=1 表示把第一行数据丢弃.

    示例:

    from pandas import read_excel
    df1 = read_excel(r'E:data_temp
    ead_excel.xlsx')
    print(df1)
    

    4.3.4 mysql文件导入

    python中操作mysql的模块是PyMySQL

    import pandas as pd
    import pymysql
    
    dbconn = pymysql.connect(host="127.0.0.1",
                             database="demo",
                             user="root",
                             password="root",
                             port=3306,
                             charset="utf8")
    sqlcmd = "select * from  mobile"
    a= pd.read_sql(sqlcmd,dbconn) #将mysql数据导入pandas模块
    print(a)
    dbconn.close()
    

    读取myql的其他方法:

    import pymysql.cursors
    import pymysql
    import pandas as pd
    
    config={'host':'localhost',
            'port':3306,
            'user':'root',
            'password':'root',
            'db':'demo',
            'charset':'utf8',
            'cursorclass': pymysql.cursors.DictCursor}
    ## 创建连接
    conn = pymysql.connect(**config)
    try:
        with conn.cursor() as cursor:
            sql = "select * from mobile"
            cursor.execute(sql)
            result = cursor.fetchall()
    finally:
        conn.close()
        
    df = pd.DataFrame(result)
    print(df.head())
    

    另一种mysql读取文件:

    import pandas as pd
    from sqlalchemy import create_engine
    engine = create_engine('mysql+pymysql://root:root@localhost:3306/demo')
    df = pd.read_sql('select * from mobile',engine)
    print(df)
    

    4.4 数据导出

    4.4.1 导出csv文件

    to_csv 函数可以加你数据导出为csv文件,命令格式如下:

    to_csv(file_path, sep='','',index=TRUE,header=TRUE)
    
    • file_path : 文件路径
    • sep: 分隔符
    • index 导出是否显示行号 ,默认true
    • header :是否导出列名,默认true
    from pandas import DataFrame
    from pandas import Series
    df = DataFrame({'age':Series([21,22,23]),'name': Series(['张三','李四','王五'])})
    df.to_csv(r'E:data_temp	o_csv.csv',encoding="utf_8_sig") #中文乱码,utf-8格式无法解决
    

    4.4.2 导出excel文件

    to_excel 导出excel格式文件,用法同上

    from pandas import DataFrame
    from pandas import Series
    df = DataFrame({'age':Series([21,22,23]),'name': Series(['张三','李四','王五'])})
    df.to_excel(r'E:data_temp	o_excel.xlsx',encoding="utf_8_sig") #中文乱码,utf-8格式无法解决
    

    4.4.3 导出到Mysql库

    to_sql将数据存储到mysql

    from pandas import DataFrame
    from pandas import Series
    from sqlalchemy import create_engine
    
    #启动引擎
    engine = create_engine("mysql+pymysql://root:root@localhost:3306/demo?charset=utf8")
    df = DataFrame({'mobile':Series(["张三","李四"]),"mobile_encrypt":Series(["ojbk1","ojbk2"])})
    df.to_sql(name="mobile",
              con=engine,
              if_exists='append',
              index=False,
              index_label=False)
    

    tip: 注意文件名不要和模块名重复,会报错

    5.数据处理

    5.1 数据清洗

    在数据分析前,海量原始数据中存储着大量不完整, 不一致,异常的垃圾数据.严重影响分析数据的结果,所以数据清洗尤为重要.

    1. 重复值处理:

    利用pandas的模块处理重复数据的问题,步骤如下:

    • 利用DataFrame中的duplicated方法,返回一个布尔值的Series,显示是否有重复行,没有重复行为False,有重复行的第二个起均为True

    • 再利用DataFrame的drop_duplicates方法,返回一个移除重复行的DataFrame

      示例:

      from pandas import Series
      from pandas import DataFrame
      df = DataFrame({'age':Series([21,12,23]),"name":Series(["张三","张三","王五"])})
      print(df)
      print(df.duplicated("name"))
      new_df = df.drop_duplicates() #两个字段均重复的,才进行删除操作
      new_df1 = df.drop_duplicates("name") #name字段如果有重复的,则把除第一个外,所有行记录都删除
      print(new_df)
      print(new_df1)
      

    2. 缺失值处理:

    从统计上说,缺失的数会导致样本数据不能很好的代表整体

    处理缺失数据的两个步骤:

    • 识别缺失数据

      pandas使用NaN标识数字缺失数据,并使用.isnull,和.notnull函数判断缺失情况

      缺失数据的识别:

      from pandas import DataFrame
      from pandas import read_excel
      df = read_excel(r'E:data_tempdata.xlsx')
      print(df)
      print(df.isnull())
      
    • 对缺失数据进行处理

      • 使用dropna: 去除数据结构中值为空的行.

        from pandas import DataFrame
        from pandas import read_excel
        df = read_excel(r'E:data_tempdata.xlsx')
        print(df)
        print(df.isnull())
        
        new_df = df.dropna();# 去除具有空数据的行
        print(new_df)
        
        
      • 使用df.fillna(): 用其他值替代

        from pandas import DataFrame
        from pandas import read_excel
        df = read_excel(r'E:data_tempdata.xlsx')
        print(df)
        
        print(df.isnull())
        
        new_df = df.dropna();
        print(new_df)
        
        new_df2 = df.fillna("?") #将NaN 替换为一个?,可以是任意字符串
        print(new_df2)
        new_df3 = df.fillna(method="pad") #将NaN 替换为一个?,可以是任意字符串
        print(new_df3)
        
        
      • 使用 df.filena(method='pad') :用前一个值来替代, 使用.fillna(method='')

        from pandas import DataFrame
        from pandas import read_excel
        df = read_excel(r'E:data_tempdata.xlsx')
        
        new_df3 = df.fillna(method='pad') # 使用同一字段下,前一个(索引小于他的)值替换
        print(new_df3)
        
        new_df4 = df.fillna(method='bfill')# 使用同一字段下,后一个(索引小于他的)值替换
        print(new_df4)
        
      • 使用.mean() :使用平均数或者其他统计常量来代替

        from pandas import DataFrame
        from pandas import read_excel
        df = read_excel(r'E:data_tempdata.xlsx')
        new_df5 = df.fillna(df.mean())
        print(new_df5)`
        
        new_df7= df.fillna(df.mean()["英语":"数学"]) #列从英语到数学区间内的字段,使用平均数处理
        print(new_df7)
        
      • 对不同的列填充不同的值:

        df.fillna({'列名1':值,'列名2':值2})
        
        new_df8 =df.fillna({"数学":9999,"语文":6666})
        print(new_df8)
        
      • 去除字符数据首尾指定字符,类比php中的trim

        from pandas import DataFrame
        df_new = DataFrame({"age":Series([11,22,33]),"name":Series(["张三  ","李四  "," 王五"])})
        print(df_new)
        print(df_new["name"].str.rstrip()) 
        

    5.2 数据抽取

    5.2.1 字段抽取

    字段抽取指的是抽取指定位置的数据做成新的列,命令如下

    slice(start,stop)
    

    使用实例

    from pandas import DataFrame
    from pandas import Series
    from pandas import read_excel
    
    df = read_excel(r'C:workspacegit_repopythondata_analysischapter2
    esourcedata.xlsx')
    print(df)
    mobile = df["电话"].astype(str) # astype将列的值转换数据类型
    print(mobile)
    
    band = mobile.str.slice(0,3) #抽取前三位,用于判断电话服务商
    print(band)
    area = mobile.str.slice(3.7) #用于判断区域
     
    tell = mobile.str.slice(7,11)
    print(tell)
    

    5.2.2 字段拆分

    拆分是按照指定的分隔符sep,拆分已有的字符串

    split(sep,n,expand=False)
    
    • sep用于分隔字符串的字符
    • n 表示分隔后新增的列数
    • expand 表示是否展开为数据框

    实例:

    from pandas import DataFrame
    from pandas import Series
    from pandas import read_excel
    
    df = read_excel(r'C:workspacegit_repopythondata_analysischapter2
    esourcedata.xlsx')
    ip = df["ip"].astype(str)
    ip = ip.str.strip()
    print(ip)
    
    new_df = ip.str.split('.',1,True)
    print(new_df)
    '''
    192.168.0.86这个ip,根据 . 进行查分,如果列数n=1,expand=False则会拆分成 [192,168.0.86],
    如果expand=True, 会拆分成 192, 168.0.86
    '''
    #如果是要给列重新命名,必须是dataFrame对象,上面的new_df已经转换成list了
    

    5.2.3 重置索引

    重置索引是指指定的列作为索引,方便对其他数据进行操作.使用如下:

    df.set_index("列名")
    

    使用实例

    from pandas import DataFrame
    from pandas import Series
    
    df1 = DataFrame({"age":Series([21,22,23,24]),"name":Series(["张三","李四","王五","赵六"])})
    print(df1)
    
    df2 = df1.set_index("name") #以name作为新的索引/行号
    print(df2)
    

    5.2.4 记录抽取

    记录抽取是根据一定条件对数据进行抽取:

    df[condition] #condition是具体的条件
    

    参数说明: condition 表示过滤条件

    返回值: DataFrame

    常见的过滤条件有:

    • 比较运算符: ==,<,>,<=,>=,!= 如: df[df.comments>1000]
    • 范围运算: between(left,right) 如: df[df.comments.between(1000,10000)]
    • 空置运算符: panda.isnull(column)如df[df.title.isnull]
    • 字符匹配: str.contains(pattern,na=False)
    • 逻辑运算: &,|,not

    使用实例:

    import pandas
    from pandas import read_excel
    
    df =read_excel(r'C:workspacegit_repopythondata_analysischapter2
    esourcedata.xlsx')
    print(df[df.电话==15931822328])
    print(df[df.电话>15931822330])
    

    5.2.5随机抽样

    所及抽样指随机从数据中按照一定的行数或者比例进行抽取的取样,随机抽样格式如下

    numpy.random.randint(start,end,num)
    
    • start: 开始值
    • end: 结束值
    • num: 表示抽样个体

    返回值: 索引值序列

    使用实例:

    import numpy as np
    import pandas 
    df = DataFrame(r'C://xxxx')
    r = np.random.randint(1,10,3) #从1到10取3个,随机抽样
    print(df.loc[r]) # 通过向.loc中传入索引号可获取指定行数的记录
    

    5.2.6通过索引抽取数值

    使用索引名(标签)选取数据,df.loc[行标签,列标签]

    实例代码如下:

    df.set_index("学号")
    print(df.head())
    print(df.loc[1:1]) #这个都是闭区间,两端都可以去的到
    

    5.2.7 字典数据抽取

    字典数据抽取是指将字典数据抽取为dataframe,有以下三种方法:

    • 字典的key和value都作为一列

    5.3 插入记录

    5.4 修改记录

    5.5 交换行或列

    5.6 排名索引

    5.6.1 sort_index 重新排序

    5.6.2 reindex 重新索引

    5.6.3 set_index 重置索引

    5.6.4 索引还原

    5.7 数据合并

    5.7.1 记录合并

    5.7.2 字段合并

    5.7.3 字段匹配

    5.8 数据计算

    5.8.1 简单计算

    5.8.1 数据标准化

    5.9 数据分组

    5.10 日期处理

    5.10.1 日期转换

    5.10.2 日期格式化

    5.10.3 日期抽取

  • 相关阅读:
    我的第一个Node.js项目
    map.keySet()获取map全部的key值
    sql语句的优化
    操作数据库的快捷键
    学习方法(准则)
    input输入框的readonly属性-----http://www.w3school.com.cn/tags/tag_input.asp
    Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html
    java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
    jQuery入门--- 非常好
    JQuery_九大选择器
  • 原文地址:https://www.cnblogs.com/callmelx/p/12934537.html
Copyright © 2020-2023  润新知