zoukankan      html  css  js  c++  java
  • pandas基础

    1.Pandas数据结构
    1. Series :是一种类似于一维数组的对象,由一组数据以及一组与之相关的数据标签(即索引)组成。
    2. DataFrame :是一个表格型的数据结构,既有行索引又有列索引的一种数据结构.
    2.外部导入数据
    • 导入xlsx
    • 导入CVS
    • 导入txt
    • 导入SQL

    格式 :

    pd.read_excel(r"D:Data-Sciencesharedatapandas_train.xlsx",encoding = "gbk",engine='python',sep = " ")

    导入SQL :

    import pymysql
    sql_cmd = "SELECT * FROM memberinfo"
    db = pymysql.connect(host = "X.X.X.X",
                         user = "XXX",
                         password = "*******",
                         db = "XXX" ,
                         charset = "utf8")
    # host:数据库地址/本机使用localhost  
    # user:用户名  
    # password:密码  
    # db:数据库名  
    # charset:数据库编码,一般为UTF-8
    #注:如果用户名或密码中包含特殊符号@、%等符号时,需要修改密码方可链接
    df = pd.read_sql(sql_cmd, db)

    总结:

      同样数量的数据,导入excel格式是导入csv格式的10倍,所以尽量将表转为csv以后进行处理

    3.数据熟悉

    head(N)

    输出前N行 , 默认5行

    shape

    输出(行数, 列数)

    info()

    输出表相关信息

    describe()

    输出数值型数据的count,中位数,min,max,mean等

    4.数据预处理

    4.1.删除缺失值

    dropna() 默认删除含有缺失值得行

    参数:

    how="all" 删除全为缺失值的行

    4.2.填充缺失值

    fillna()

    #fillna()和dropna()默认会返回一个替换后的新对象,不改变源数据,这个时候将替换后的数据赋值给新的表,如果要改变源数据,通过传入inplace=True进行更改

    # 以字典的形式指明要填充的列名

    5.重复值处理

    对于重复值我们一般是进行删除处理,使用的方法是drop_duplicates()

    #subset表示按哪列/几列进行去重

    #keep=first表示保留保留第一个,=last表示保留最后一个,=False表示删除所有重复值,默认是first

    #inplace表示是否更改源数据

    6.异常值处理
    • 最常用的处理方式就是删除。
    • 把异常值当作缺失值来填充。
    • 把异常值当作特殊情况,研究异常值出现的原因。

    类型

    说明

    int

    整型数,即整数

    float

    浮点数,即含有小数点

    object

    python对象类型,用O表示

    string_

    字符串类型,经常用S表示,S10表示长度为10的字符串

    unicode_

    固定长度的unicode类型,跟字符串定义方式一样,经常用U表示

    7 索引设置
    7.1  为无索引表设置索引

    df.columns = ["技能","周数"]

    df.index = ['第一', '第二', '第三', '第四']

    7.2  重新设置索引

    #设置单一索引

    df112.set_index("用户编号").head()

    #设置层次化索引

    df64=df112.set_index(["家庭成员","好坏客户"])

    7.3 重命名索引

    #利用rename的方法对行/列名进行重命名

    columns={"用户编号":"用户编号-测试",

            "好坏客户":"好坏客户-测试"}

    index={0:"zero",

          1:"one"}

    df112.rename(columns=columns,index=index).head()

    7.4 重置索引

    reset_index(level=None, drop=False, inplace=False)

    level 参数用来指定要将层次化索引的第几级别转化为 columns,第一个索引为 0 级,第二个索引为 1 级,默认为全部索引,即默认把索引全部转化为 columns。

    drop参数用来指定是否将原索引删掉,即不作为一个新的columns,默认为False, 即不删除原索引。

    inplace 参数用来指定是否修改原数据表。

    8 数据选择

      普通索引: 通过传入列名选择数据. (行和列有区别 , 行用到loc)

      位置索引: iloc 方法

    8.1 列选择

    #获取某一列,其实就是一个Series

    df["家庭成员"].head()

    #获取特定的某几列

    df[["用户编号","年龄"]].head()

    # 选择某几列,如第一列和第三列

    df.iloc[:,[0,2]].head()

    # 选择连续的某几列,如第一列到第三列

    df.iloc[:,[0:2]].head()

    8.2 行选择

    # 选择某行/某几行

    df521.loc[["零","二"]]

    #利用位置索引第一行和第三行

    df521.iloc[[0,2]]

    #利用位置索引第一行到第三行

    df521.iloc[0:2]

    8.2.1筛选满足条件的行

    df112[(df112["用户编号"]>10)|(df112["年龄"]<25)]

    8.3 列行同时选择

    df[df["QADays"]<5]["GoodsID"]

    df521.loc[["零","一"],["用户编号","年龄"]]

    df521.iloc[[0,1],[0,2]]

    df112[df112["用户编号"]<5][["用户编号","年龄"]]

    df521.iloc[0:2,0:3]

    #交叉索引用到ix

    df521.ix[0:3,["用户编号","年龄"]]

    9.数值操作
    9.1 数值替换replace()

    #针对全表一对一进行替换

    import numpy as np

    df112.replace(np.NaN,0).head()

    #针对全表多对一进行替换

    df112.replace([0,1],"替换值").head()

    #针对全表多对多替换

    df112.replace({1:"是",0:"否"}).head()

    #针对某列进行替换,且不更改源数据 ,参数inplace = True/False

    df112["好坏客户"].replace({1:"是",0:"否"},inplace=False).head()

    9.2数值排序sort_values()

    #按某列进行升序, 默认升序即 ascending = True , 按照某一列 by=["年龄"]

    #缺失值默认放在后面 , 可改为前面即: na_position="first"

    df112.sort_values(by=["年龄"]).head()

    #按某几列进行升序排列

    #先按第一列进行升序,如果第二列有重复值,则再按第二列进行降序

    df112.sort_values(by=["用户编号","年龄"],ascending=[True,False]).head()

    9.3数值排名rank()

    method

    说明

    "average"

    这种处理方式与Excel中RANK.AVG一致

    "first"

    按值在所有的待排列数据中出现的先后顺序排名

    "min"

    这种处理方式与Excel中RANK.EQ一致

    "max"

    与min相对应,取重复值对应的最大排名

    rank(ascending,method)

    #默认 method = average 

    df["成交量"].rank()

    9.4 数值删除drop()

    #删除一列/多列

    df112.drop(columns=["用户编号","年龄"]).head()

    #删除一列/多列,对于直接传入列名需要 传入参数axis=1 , 而0表示删除行

    df112.drop(["用户编号","年龄"],axis=1).head()

    #同样需要传入inplace=True才可以改变原始数据

    #根据行索引删除行

    df112.drop([0,1],axis=0).head()

    df112.drop(df112.index[[0,1]]).head()

    9.5数值计数value_counts()

    #各类别占比 normalize = True

    df112["好坏客户"].value_counts(normalize = True)

    9.6唯一值获取unique()

    df112["年龄"].unique()

    9.7数值查找isin()

    df112["好坏客户"].isin([0,1])

    9.8区间切分cut() 和 qcut()

    #自定义切分

    bins=[0,100,1000,10000,150000]

    pd.cut(df112["用户编号"],bins).unique()

    #等量切分 如5等分

    pd.qcut(df112["用户编号"],5).unique()

    9.9 插入新的行或列insert()

    df112.insert(3,"插入-测试",data)#表示在第4列插入一列名为"插入-测试"的数据data

    #方法二,在最后一列后面插入一列

    df112["新插入一列"] = data

    9.10行列互换 T

    #转置

    df12.T.T

    9.11索引重塑stack()

    9.12长宽表转换

     

    >>df612.melt(id_vars = ["Company","Name"],
               var_name = "Year",
               value_name = "Sale")   
    -----------------------
    Company    Name    Year    Sale
    0    Apple    苹果    Sale2013    5000
    1    Google    谷歌    Sale2013    3500
    2    Facebook    脸书    Sale2013    2300
    3    Apple    苹果    Sale2014    5050
    4    Google    谷歌    Sale2014    3800
    5    Facebook    脸书    Sale2014    2900
    6    Apple    苹果    Sale2015    5050
    7    Google    谷歌    Sale2015    3800
    8    Facebook    脸书    Sale2015    2900
    9    Apple    苹果    Sale2016    5050
    10    Google    谷歌    Sale2016    3800
    11    Facebook    脸书    Sale2016    2900

    id_vars 参数用于指明宽表转换到长表时保持不变的列,

    var_name 参数示原来的列索引转化为“行索引”以后对应的列名,

    value_name 表示新索引对应的值的列名。

     9.13 apply()和applymap() 函数

    df611.applymap(lambda x:x*2)

    df611["C2"].apply(lambda x:x+2)

    10 数据运算
    10.1 算术运算

    + - * /

    10.2 比较运算

    < > = !=

    10.3 汇总运算

    函数

    说明

    count

    非NA值得数量

    mean

    平均值

    sum

    求和

    max

    求最大值

    min

    求最小值

    median

    中位数

    mode

    求众数

    var

    方差

    std

    标准差

    quantile

    求分位数

    corr

    相关系数

    #两变量的相关系数
    
    df112["年龄"].corr(df112["月收入"])
    
    out : 0.03771565421103959
    
    #相关系数矩阵
    
    df112.corr()
    11时间函数
    11.1 datetime和time的区别

    time是基于系统层面的一些操作,datetime 基于time进行了封装,提供了更多实用的函数。

    11.2 datetime
    >>from datetime import datetime 
    >>now = datetime.now()
    #时间元组
    out : datetime.datetime(2019, 8, 12, 19, 57, 31, 214668)
    # 年,月,日,星期
    >> now.year  now.month  now.day  now.weekday()  
    # 日期的年份、全年的周数、本周第几天:(2019, 33, 1)
    >> now.isocalendar()

    11.3 time

    >>import time
    #获取时间长格式
    >>time.localtime()
    out:  time.struct_time(tm_year=2019, tm_mon=8, tm_mday=12, tm_hour=20, tm_min=6, tm_sec=46, tm_wday=0, tm_yday=224, tm_isdst=0)
    #时间戳
    >>time.time()
    out:  1565611051.3792284
    11.7 格式化时间

    strptime()是将时间格式的时间转化为某些自定义的格式,具体的格式有以下:

    #字符串转为time
    s_time = '2019-01-03 08:57:21'
    time.strptime(s_time,"%Y-%m-%d %H:%M:%S")
    #字符串转为datetime
    datetime.strptime(s_time,"%Y-%m-%d %H:%M:%S")

    代码

    说明

    %H

    小时(24小时制)[00,23]

    %I

    小时(12小时)[01,12]

    %M

    2位数的分[00,59]

    %S

    秒[00,61]

    %w

    用整数表示星期几,从0开始

    %U

    每年的第几周,周日被认为是每周第一天

    %W

    每年的第几周,周一被认为是每周第一天

    %F

    %Y-%m-%d的简写形式,例如2018-04-18

    %D

    %m/%d/%y的简写形式,例如04/18/2018

    strftime是将时间格式的时间转化为某些自定义的格式,具体的格式有以下:

    #time转化为字符串
    time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
    #datetime转化为字符串
    datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    代码

    说明

    %H

    小时(24小时制)[00,23]

    %I

    小时(12小时)[01,12]

    %M

    2位数的分[00,59]

    %S

    秒[00,61]

    %w

    用整数表示星期几,从0开始

    %U

    每年的第几周,周日被认为是每周第一天

    %W

    每年的第几周,周一被认为是每周第一天

    %F

    %Y-%m-%d的简写形式,例如2018-04-18

    %D

    %m/%d/%y的简写形式,例如04/18/2018

    11.4 时间索引
    import pandas as pd
    import numpy as np
    index = pd.DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05', '2018-02-06', '2018-02-07', '2018-02-08',
    '2018-02-09', '2018-02-10'])
    data = pd.DataFrame(np.arange(1,11),columns = ["num"],index = index)
    
    
    #时间索引pandas.datatimeindex()用处
    #获取2018年的数据
    data["2018"]
    #获取2018年1月1到1月3的数据
    data["2018-01-01":"2018-01-03"]
    11.5 日期之差

     

    11.6 时间偏移
    12 数据分组/透视
    12.1 分组键时列名

    # 分组键是多个列

    groupby(["区域","客户分类"])

    #获取某列的分组结果

    df2.groupby(["区域","是否省会"])["7月销量"].sum()

    12.2 aggregate方法

    除了常规的加减乘除计数之外,还可以自定义函数,并通过aggregate或agg方法传入即可。

    #不同列做不同的聚合运算

    df2.groupby("客户分类").aggregate({"用户ID":"count","7月销量":"sum","8月销量":"sum"})

    #针对相同的列做不同的聚合运算

    df2.groupby(["区域"])["7月销量"].aggregate(["count","sum"])

    #该函数是针对每个分组内的数进行计算的

    def zidingyi(arr):

        return arr.sum()

    df2.groupby(["区域","是否省会"])["7月销量"].agg(zidingyi)

    #参数: 以无索引形式返回聚合数据

    as_index=False

    12.3 数据透视表   pivot_table()

    pd.pivot_table(data,values=["7月销量","8月销量"],index=["区域","客户分类"],columns="是否省会",aggfunc="sum", fill_value=0,margins=True,margins_name="总计")

    参数:

      • 缺失值填充: fill_value 默认为Nan
      • 合计: margins 默认关闭
      • 合计名: margins_name
    13 多表联结
    13.1 横向联结(列联结)

    merge(table1,table2,...)

    参数:

      • on # 用on来指定连接键 ,默认以公共列
      • how # 联结方式 inner outer right left
      • suffixes #重复列名处理
    13.2 纵向联结(行联结)

    concat()

    参数:

      • ignore_index #忽略索引
      • drop_duplicates() #重置数据处理
    14 结果导出
    14.1 Excel单个sheet

    #无穷值处理

    df2.to_excel(excel_writer = r"D:Data-Sciencesharedata测试文档.xlsx",sheet_name = "这是sheet名",index = False,columns = ["学号","班级"],encoding = "utf-8",na_rep = 0,inf_rep = 0)

    参数:

      • na_rep #缺失值处理
      • inf_rep #无穷值处理
    14.2 Excel多个sheet
    #声明一个读写对象
    #excelpath为文件要存放的路径
    excelpath = "D:/Data-Science/share/data/多文件报表.xlsx"
    
    
    writer = pd.ExcelWriter(excelpath,engine = "xlsxwriter")
    
    
    df1 = t2.reset_index()
    df2 = t1.reset_index()
    df3 = t11.reset_index()
    
    
    #分别将表df1、df2、df3写入excel中的sheet1、sheet2、sheet3
    #并命名为表1、表2、表3
    df1.to_excel(writer,sheet_name = "表1")
    df2.to_excel(writer,sheet_name = "表2")
    df3.to_excel(writer,sheet_name = "表3")
    
    
    #保存读写的内容
    writer.sav
    14.3 导出 CVS

    #设置分割符,多列, 编码, 设置索引

    df2.to_csv(r"D:Data-Sciencesharedata测试.csv",index = False,columns = ["学号","班级"],encoding = "gbk",sep = ",")

  • 相关阅读:
    [转贴]ASP.NET下对远程SQL SERVER数据库的备份和恢复的存储过程
    [原创]一个不错TreeView的样式
    [转贴]如何在ASP.NET中用OWC绘制图表
    [讨论]如何提高博客的访问量,写什么样的文章比较吸引读者啊!
    Revit API电缆桥架CableTray
    黄聪:win7系统下麦克风无法使用、有杂音和电流声的解决办法
    黄聪:.Net Framework Initialization Error – Unable to find a version of the runtime to run this application解决方案
    黄聪:js、Jquery将日期例如(20120903)转换为数字格式
    黄聪:wordpress文章同步发布到网易、天涯、新浪博客、百度空间插件
    黄聪:WIN7下安装 virtualbox WIN7系统 无法安装增强功能
  • 原文地址:https://www.cnblogs.com/liuyuanq/p/11306270.html
Copyright © 2011-2022 走看看