zoukankan      html  css  js  c++  java
  • Pandas

    pandas介绍

      pandas 是基于NumPy 的一种工具,提供了大量能使我们快速便捷地处理数据的函数和方法。它是使Python成为强大而高效的数据分析环境的重要因素之一。我们知道numpy能够帮助我们处理数值型数据,但是这还不够,除数值型数据以外,我们还有能够处理字符串数据、时间序列等数据。所以,pandas的除了能处理数值型数据,还可以帮助我们处理其他类型的数据。(字符串、时间序列等数据)

    Pandas的常用数据类型

           1. Series 一维(带标签数组)

           2. DataFrame 二维 (Series容器)

    一、Series的创建

       Series对象本质上由两个数组构成(键:值):一个数组构成对象的键(index(索引)),另一个是值(values)

    1.通常的创建方式

    import pandas as pd
    a = pd.Series([1,2,3,4],index=list("abcd"))    #创建序列  index为指定索引的值 默认:0,1,2....
    print(a)
    
    """
    输出结果
    a    1
    b    2
    c    3
    d    4
    dtype: int64
    """

     

    2.字典方式创建

    import pandas as pd
    dict = {"name":"zhangsan","age":12,"tel":100}
    data = pd.Series(dict)
    print(data)
    print(type(data))       #输出data的数据类型为Series
    
    """
    运行结果:
    name    zhangsan
    age           12
    tel          100
    dtype: object
    <class 'pandas.core.series.Series'>
    """

      也可以用data.dtye查看数据类型,如果要修改数据类型,则data.astype(float)

     

    Series取值

    import pandas as pd
    dict = {"name":"zhangsan","age":12,"tel":100}
    data = pd.Series(dict)

    print("键取值:")
    print(data['age'],data['tel']) #通过键取值

    print("位置取值:")
    print(data[0],data[1]) #通过位置取值

    print("前两行:")
    print(data[:2]) #取前两行

    print("不连续的:")
    print(data[[0,2]]) #取不连续的 或者data[["name","tel"]]


    """
    运行结果:
    键取值:
    12 100
    位置取值:
    zhangsan 12
    前两行:
    name zhangsan
    age 12
    dtype: object
    不连续的:
    name zhangsan
    tel 100
    dtype: object
    """

     data[data>55] 选出大于55的值。切片:data[0:2:1]

     

    其他操作

    import pandas as pd
    dict = {"name":"zhangsan","age":12,"tel":100}
    data = pd.Series(dict)
    print(data.index)           #取索引
    print(data.values)          #取值
    
    
    """
    运行结果:
    Index(['name', 'age', 'tel'], dtype='object')
    ['zhangsan' 12 100]
    """

     

     

    二、pandas读取外部数据

    import pandas as pd
    
    #读取csv中的文件
    # df = pd.read_csv("文件路径")    #如:pd.read_csv("data_file//data.csv")
    
    #读取mysql中的数据
    # import pymysql
    # conn = pymysql.connect(host='localhost', user='root', passwd='root', db='anjuke')
    # sql_sentence = "select * from lp_home"
    # df = pd.read_sql(sql_sentence,conn)
    
    
    #读取MongoDB中的数据
    # from pymongo import MongoClient
    # client = MongoClient()
    # collection = client["数据库名"]["表名"]
    # data = list(collection.find())

     

     

    三、DataFrame

    DataFrame对象既有行索引,又有列索引

      行索引:表名不同行,横向索引(index),0轴,axis=0

      列索引:表名不同列,纵向索引(columns),1轴,axis=1

    1.通常创建方式:

    
    
    import pandas as pd
    import numpy as np
    
    #index:行索引   columns:列索引  reshape:改变数组格式(三行四列)
    pf = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))        
    print(pf)

    """
    运行结果: w x y z a 0 1 2 3 b 4 5 6 7 c 8 9 10 11 """

     

    2.字典方式创建:

    import pandas as pd
    import numpy as np
    
    dict = {"name":["张三","李四"],"age":[12,20],"tel":[100,101]}
    pf = pd.DataFrame(dict)
    print(pf)
    dict1 = [{"name":"张三","age":12,"tel":100},{"name":"李四","age":20,"tel":101}]
    pf1 = pd.DataFrame(dict1)
    print(pf1)
    
    """
    运行结果:
      name  age  tel
    0   张三   12  100
    1   李四   20  101
      name  age  tel
    0   张三   12  100
    1   李四   20  101
    """

     两种方式都是一样的结果

     

    3.DataFrame的基础属性

      df.shape  #行数 列数    

      df.dtpyes  #列数据类型

      df.ndim  #数据维度

      df.index  #行索引

      df.columns  #列索引

      df.values  #对象值,二维ndarray数组

    import pandas as pd
    import numpy as np
    
    dict = {"name":["张三","李四"],"age":[12,20],"tel":[100,101]}
    pf = pd.DataFrame(dict)
    #pf.index  行索引
    print(pf.index)
    #pf.columns     列索引
    print(pf.columns)
    #pf.values     对象值
    print(pf.values)
    #pf.shape   行数、列数
    print(pf.shape)
    #pf.dtypes  列数据类型
    print(pf.dtypes)
    
    
    """
    运行结果:
    RangeIndex(start=0, stop=2, step=1)
    Index(['name', 'age', 'tel'], dtype='object')
    [['张三' 12 100]
     ['李四' 20 101]]
    (2, 3)
    name    object
    age      int64
    tel      int64
    dtype: object
    """

    4.DataFrame整体情况查询

      df.head(3)    #显示头部3行,默认5行

      df.tail(3)    #显示末尾3行,默认5行

      df.info()    #相关信息概述:行数、列数、列索引、列非空值个数、列类型、内存占用        可以用来判断缺失值

      df.describe()    #快速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值

     

    5.排序

    import pandas as pd
    import numpy as np
    
    dict = {"name":["张三","李四"],"age":[12,20],"tel":[100,101]}
    pf = pd.DataFrame(dict)
    #按照某列排序 sort = pf.sort_values(by="age",ascending=False) #by:按哪个属性进行排序 ascending=False 降序排序 ascending默认为True 升序 print(sort) """ 运行结果: name age tel 1 李四 20 101 0 张三 12 100 """

     

    6.切片

      df[:20]  取前20行

      df['age']  取age列

      df[:20]['age']  取age列的前20行

    注意:

      *方括号写数组,表示取行,对行进行操作

      *方括号写字符串,表示取列,对列进行操作

    7.loc选择方式

      df.loc通过标签索引行数据

      df.iloc通过位置获取行数据

    import pandas as pd
    import numpy as np
    
    pf = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))
    pf.loc[:,"w"]    #取w列
    pf.loc["a",:]    #取a行
    #选取索引b行w z的值 print(pf.loc["b",["w","x"]]) #选取多行多列的值 print(pf.loc[["a","b"],["w","x"]]) #选取连续行多列的值 print(pf.loc["a":"c",["w","x"]]) """ 运行结果: w 4 x 5 Name: b, dtype: int32
    w x a 0 1 b 4 5
    w x a 0 1 b 4 5 c 8 9
    """
    import pandas as pd
    import numpy as np
    
    pf = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))
    # #选取索引b行w z的值
    
    pf.iloc[1,:]     #取第2行
    pf.iloc[:,2]     #取第3列
    pf.iloc[[1,2],[0,1]]  #取2,3行的1,2列
    pf.icol[1:,:2]   
    pf.iloc[[1,2],[0,1]] = 100   #可赋值操作

     

    取值条件

    import pandas as pd
    import numpy as np
    
    pf = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))
    # print(pf)
    #获取x列值大于1小于10的行
    print(pf[(pf["x"]>1)&(pf["x"]<10)])         #注意:不同的条件之间需要用括号括起来


    #修改、替换操作
    #data['area'] = data['area'].apply(lambda x:x.replace('平方米','')).astype(float)


     

     数据筛选:

    #单个筛选条件
    data[data['price']>3000]

    #多个筛选条件 注意:使用 &(且) 和 |(或) 时每个条件都要用小括号括起来
    data[(data['price']>3000) & (data['price']<4000)]
    data.loc[(data['price']>3000) & (data['price']<4000)]

    #选取多列 (选取总价小于40的两列price,area)
    # 方法一:
    data[['price','area']][data['total_price']<40]
    # 方法二:
    data.loc[data['total_price']<40,['price','area']]

    #选取某列等于多个数值或字符串时,用.isin() (注意:isin括号里是个list)
    data[data['make_year'].isin([2019,2012])] #选取年份为2019和2012的数据
    #使用loc函数选取
    data.loc[(data['make_year']==2019)|(data['make_year']==2012)]
    #删除室字段为'7' '9' ...的一整行
    data = data.drop(data.loc[(data['室'].isin(['7','9','10','12','15']))].index)

    # str.contains()   意思跟SQL语句里用like一样
    data.loc[data['floor'].str.contains("高")] #匹配出有“高”的数据
    data.loc[data['floor'].str.contains("高|低")] #匹配出有“高”| “低”的数据

    四、布尔索引

     缺失值数据处理

      缺失值一个分为两种情况:一种是空与None   另一种是某些为0的数据      注意:pandas的NaN和np.nan是一样的

    import pandas as pd
    import numpy as np
    
    pf = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))
    # print(pf)
    
    
    pf.iloc[[1,2],0] = ""
    pf.iloc[0,0] = 1
    print(pf)
    
    #处理w列为空的值
    a = pf['w'].fillna(0)
    a[a==''] = np.nan
    pf['w'] = a
    print(pf)
    
    
    """
    运行结果:
       w  x   y   z
    a  1  1   2   3
    b     5   6   7
    c     9  10  11
         w  x   y   z
    a    1  1   2   3
    b  NaN  5   6   7
    c  NaN  9  10  11
    """
    
    
    #判断数据是否为NaN:pd.isnull(pf),  pd.notnull(pf)
    # print(pd.isnull(pf))
    
    #处理方式1:删除NaN所在的行列dropna(axis=0,how='any',inplace=False)
    # print(pf.dropna(axis=0))        #删除含有NaN的行
    # print(pf.dropna(axis=0,how='any',inplace=False))          #删除含有NaN的行    inplace:是否原地修改
    # print(pf.dropna(axis=0,how='all'))          #必须每行都有NaN才删除
    
    #处理方式2:填充数据,t.fillna(t.mean()),  t.fiallna(t.median()),  t.fillna(0)
    # print(pf.fillna(100))           #操作全部
    # print(pf['w'].fillna(0))         #操作具体的某一列
    
    #处理为0的数据:t[t==0]=np.nan
    #注意:不是每次为0的数据都需要处理,计算平均值等情况,nan不参与计算,但0参与计算

     

    Pandas字符串用法
    方法 说明
    cat

    实现元素级的字符串连接操作,可指定分隔符

    contains

    返回表示各字符串是否含有指定模式的布尔型数组

    count

    模式的出现次数

    endswith、startswith 相当于对各个元素执行x.endswith(patern)或x.startswith(pattern)
    findall 计算各字符串的模式列表
    get 获取各元素的第个字符
    join  

    根据指定的分隔符将Series中各元素的字符串连接起来

    len 计算各字符串的长度
    lower、upper

    转换大小写。相当于对各个元素执行x.lower0或x.upper0

    match

    根据指定的正则表达式对各个元素执行re.match

    pad

    在字符串的左边、右边或左右两边添加空白符

    center 相当于pad(side=/both)
    repeat

    重复值。例如,s.str.repeat(3)相当于对各个字符串执行x*3

    replace 用指定字符串替换找到的模式
    slice 对Series中的各个字符串进行子串截取
    split 根据分隔符或正则表达式对字符串进行拆分
    strip、rstrip、Ilstrip 去除空白符,包括换行符。相当于对各个元素执行x.strip()、x.rstrip()、x.lstrip()

      

    
    

     

  • 相关阅读:
    树莓派_GPIO
    Python_PyQt_基本使用
    python_静态,组合,继承
    Linux_操作
    Pyqt5+eric6安装教程
    树莓派操作
    python_爬虫_requests
    HTML的基本操作
    python_pandas_numpy_json
    python_模块_sys_time_random_os
  • 原文地址:https://www.cnblogs.com/c-pyday/p/12299783.html
Copyright © 2011-2022 走看看