• python-数据分析模块numpy-pandas


    numpy 模块

    numpy属于第三方库,需要下载安装。

    numpy库有两个作用:

    1. 区别于list列表,提供了数组操作、数组运算、以及统计分布和简单的数学模型;
    2. 计算速度快

    创建矩阵方法:

    import  numpy  as  np  #np是约定俗称将numpy简写
    
    np.array() # 创建矩阵
    
    • 一维矩阵

    一维矩阵就相当于列表

    arr =np.array([1,2,3]) 
    print(arr)
    
    [1 2 3]
    
    • 二维矩阵
    arr = np.array([[1,2,3],[1,2,3]])
    print(arr)
    
    [[1 2 3]
     [1 2 3]]
    
    • 三维矩阵
    arr = np.array([[[1,2,3],[1,2,3]],[[1,2,3],[1,2,3]]])
    print(arr)
    
    [[[1 2 3]
      [1 2 3]]
    
     [[1 2 3]
      [1 2 3]]]
    
    

    获取矩阵的行列数

    arr = np.array([[12,23,4],[12,3,4]])
    print(arr)
    
    [[12 23  4]
     [12  3  4]]
    
    print(arr.shape) #获取矩阵的行和列
    (2, 3)
    
    print(arr.shape[0]) # 获取矩阵的行
    2
    
    print(arr.shape[1]) # 获取矩阵的列
    3
    
    

    切割矩阵

    切分矩阵类似于列表的切割,但是与列表的切割不同的是,矩阵的切割涉及到行和列的切割,但是两者切割的方式都是从索引0开始,并且取头不取尾。

    arr = np.array([[12,23,4],[10,3,4],[2,4,5]])
    print(arr)
    
    print(arr[:,:]) #取所有的元素,:默认所有
    
    print(arr[0,:]) #取第一整行
    
    print(arr[:,0]) # 取第一列
    
    print(arr[1,2]) # 取第二行第三列的值
    
    print(arr[arr>10]) # 取大于10的元素
    
    [[12 23  4]
     [10  3  4]
     [ 2  4  5]]
    **************************************************
    [[12 23  4]
     [10  3  4]
     [ 2  4  5]] #取所有的元素,:默认所有
    **************************************************
    [12 23  4]  #取第一整行
    **************************************************
    [12 10  2]  # 取第一列
    **************************************************
    4   # 取第二行第三列的值
    **************************************************
    [12 23]  # 取大于10的元素
    

    矩阵元素替换

    矩阵也是一个可变类型的数据,如果对矩阵进行替换操作,会修改矩阵的元素。

    arr = np.array([[12,23,4],[10,3,4],[2,4,5]])
    print(arr)
    
    arr[1,:]=0  # 取值第二行,并让第二行的元素都为0
    print(arr) 
    
    arr[arr>10] =0  # 取大于10的值,并让其为0
    print(arr)
    
    [[12 23  4]
     [10  3  4]
     [ 2  4  5]]
    **************************************************
    [[12 23  4]
     [ 0  0  0]  # 取值第二行,并让第二行的元素都为0
     [ 2  4  5]]
    **************************************************
    [[ 0  0  4]  # 取大于10的值,并让其为0
     [10  3  4]
     [ 2  4  5]]
    
    

    矩阵的合并

    arr1 = np.array([[12,23,4],[10,3,4],[2,4,5]])
    arr2 = np.array([[11,33,6],[11,7,6],[2,4,5]])
    print(arr1)
    print('*'*50)
    print(arr2)
    print('*'*50)
    print(np.hstack((arr1,arr2))) # 合并两个矩阵的行,矩阵应该有相同的行 h表示水平
    
    print(np.vstack((arr1,arr2))) #合并两个矩阵的列,矩阵应该有相同的列,v表示垂直
    
    print(np.concatenate((arr1,arr2),axis=0)) #axis=0 表示合并两个矩阵的列,矩阵应该有相同的列,并且axis默认为0
    
    print(np.concatenate((arr1,arr2),axis=1)) #axis=1 表示合并两个矩阵的行,矩阵应该有相同的行,axis默认为0
    
    [[12 23  4]
     [10  3  4]
     [ 2  4  5]]
    **************************************************
    [[11 33  6]
     [11  7  6]
     [ 2  4  5]]
    **************************************************
    [[12 23  4 11 33  6]
     [10  3  4 11  7  6]
     [ 2  4  5  2  4  5]]  # 合并两个矩阵的行,矩阵应该有相同的行 h表示水平
    **************************************************
    [[12 23  4]
     [10  3  4]
     [ 2  4  5]
     [11 33  6]
     [11  7  6]
     [ 2  4  5]]
    **************************************************
    [[12 23  4]
     [10  3  4]
     [ 2  4  5]
     [11 33  6]
     [11  7  6]
     [ 2  4  5]]  #axis=0 表示合并两个矩阵的列,矩阵应该有相同的列,并且axis默认为0
    **************************************************
    [[12 23  4 11 33  6]
     [10  3  4 11  7  6]
     [ 2  4  5  2  4  5]] #axis=1 表示合并两个矩阵的行,矩阵应该有相同的行,axis默认为0
    

    通过函数创建矩阵

    • arange

      arr =np.arange(1,10)  #创建1-9 的数字 一维矩阵
      print(arr)
      
      [1 2 3 4 5 6 7 8 9]
      
    • linspace/loqspace

      print(np.linspace(0,20,6)) # 等差数列 取头也取尾,取6个数,并且前两个数之和等于后一个数
      
      [ 0.  4.  8. 12. 16. 20.]
      
      print(np.logspace(0,20,6))  # 等比数列 取6个数
      
      [1.e+00 1.e+04 1.e+08 1.e+12 1.e+16 1.e+20]
      
    • zeros/ones/eye/empty

      print(np.zeros((3,4))) # 创建 3*4全是0的矩阵
      
      [[0. 0. 0. 0.]
       [0. 0. 0. 0.]
       [0. 0. 0. 0.]]
      
      print(np.ones((3,4))) # 创建3*4 全是1的矩阵
      
      [[1. 1. 1. 1.]
       [1. 1. 1. 1.]
       [1. 1. 1. 1.]]
      
      print(np.eye(3))  # 创建3个主元的单位矩阵
      
      [[1. 0. 0.]
       [0. 1. 0.]
       [0. 0. 1.]]
      
      print(np.empty((4,4))) # 创建一个4*4的随机矩阵,里面的元素是随机生成的
      
      [[6.23042070e-307 1.42417221e-306 1.37961641e-306 1.24610383e-306]
       [1.69118108e-306 8.06632139e-308 1.20160711e-306 1.69119330e-306]
       [1.78019082e-306 1.78020984e-306 6.23053954e-307 8.06635110e-308]
       [7.56603881e-307 1.78019082e-306 1.78020984e-306 1.60218627e-306]]
      

    矩阵的运算

    +	两个矩阵对应元素相加
    -	两个矩阵对应元素相减
    *	两个矩阵对应元素相乘
    /	两个矩阵对应元素相除,如果都是整数则取商
    %	两个矩阵对应元素相除后取余数
    **n	单个矩阵每个元素都取n次方,如**2:每个元素都取平方
    

    pandas模块

    pandas 是python数据分析的核心模块,它有五大功能:

    1. 支持文件存取操作,数据库(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。
    2. 支持增删改查、切片、高阶函数、分组聚合等单表操作,以及和dict、list的互相转换。
    3. 支持多表拼接合并操作。
    4. 支持简单的绘图操作。
    5. 支持简单统计分析操作。

    series (一维列表)

    import numpy as np
    import pandas as pd
    arr = np.arange(1,10)
    print(arr)
    s= pd.Series(arr)
    print(s)
    
    [1 2 3 4 5 6 7 8 9]
    0    1
    1    2
    2    3
    3    4
    4    5
    5    6
    6    7
    7    8
    8    9
    dtype: int32
    

    DataFrame

    • 创建数据列表
    import pandas as pd
    import numpy as np
    
    # 定义索引(行)的值
    dates = pd.date_range('2019-01-01',periods=6)
    
    # 定义矩阵内的值
    np.random.seed(1)
    arr = 10*np.random.randn(6,4)
    
    # 进行数据表的合并,column--队列 ,表示列
    df = pd.DataFrame(arr,index=dates,columns=['c1','c2','c3','c4'])
    print(df)
    
    				c1         c2         c3         c4
    2019-01-01  16.243454  -6.117564  -5.281718 -10.729686
    2019-01-02   8.654076 -23.015387  17.448118  -7.612069
    2019-01-03   3.190391  -2.493704  14.621079 -20.601407
    2019-01-04  -3.224172  -3.840544  11.337694 -10.998913
    2019-01-05  -1.724282  -8.778584   0.422137   5.828152
    2019-01-06 -11.006192  11.447237   9.015907   5.024943
    
    • 使用pandas读取字典形式的数据(数组的长度必须相同)

      df2 = pd.DataFrame({'a':1,'b':[2,3],'c':np.arange(2),'d':'hello'})
      print(df2)
      
         a  b  c      d
      0  1  2  0  hello
      1  1  3  1  hello
      

    DataFrame属性

    dtype	查看数据类型
    index	查看行序列或者索引
    columns	查看各列的标签
    values	查看数据框内的数据,也即不含表头索引的数据
    describe	查看数据每一列的极值,均值,中位数,只可用于数值型数据
    transpose	转置,也可用T来操作
    sort_index	排序,可按行或列index排序输出
    sort_values	按数据值来排序
    
    df = pd.DataFrame(arr,index=dates,columns=['c1','c2','c3','c4'])
    
    print(df.dtypes)
    print(df.index)
    print(df.columns)
    print(df.values)
    
    # 查看类型
    c1    float64
    c2    float64
    c3    float64
    c4    float64
    dtype: object
    
    # 查看索引项
    DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
                   '2019-01-05', '2019-01-06'],
                  dtype='datetime64[ns]', freq='D')
    
    #查看列
    Index(['c1', 'c2', 'c3', 'c4'], dtype='object')
    
    # 查看值
    [[ 16.24345364  -6.11756414  -5.28171752 -10.72968622]
     [  8.65407629 -23.01538697  17.44811764  -7.61206901]
     [  3.19039096  -2.49370375  14.62107937 -20.60140709]
     [ -3.22417204  -3.84054355  11.33769442 -10.99891267]
     [ -1.72428208  -8.77858418   0.42213747   5.82815214]
     [-11.00619177  11.4472371    9.01590721   5.02494339]]
    
    查看 每一列的极值,均值,中位数
    print(df.describe())
    
                  c1         c2         c3         c4
    count   6.000000   6.000000   6.000000   6.000000
    mean    2.022213  -5.466424   7.927203  -6.514830
    std     9.580084  11.107772   8.707171  10.227641
    min   -11.006192 -23.015387  -5.281718 -20.601407
    25%    -2.849200  -8.113329   2.570580 -10.931606
    50%     0.733054  -4.979054  10.176801  -9.170878
    75%     7.288155  -2.830414  13.800233   1.865690
    max    16.243454  11.447237  17.448118   5.828152
    

    DataFrame取值

    print(df['c2']) # 按列取值
    
    2019-01-01    -6.117564
    2019-01-02   -23.015387
    2019-01-03    -2.493704
    2019-01-04    -3.840544
    2019-01-05    -8.778584
    2019-01-06    11.447237
    Freq: D, Name: c2, dtype: float64
    
    print(df[0:2]) #取第一行和第二行
    
                       c1         c2         c3         c4
    2019-01-01  16.243454  -6.117564  -5.281718 -10.729686
    2019-01-02   8.654076 -23.015387  17.448118  -7.612069
    
    • loc/iloc 自定义取值

      print(df.loc['2019-01-01':'2019-01-03']) # 通过自定义的行标签选择数据
      
       c1         c2         c3         c4
      2019-01-01  16.243454  -6.117564  -5.281718 -10.729686
      2019-01-02   8.654076 -23.015387  17.448118  -7.612069
      2019-01-03   3.190391  -2.493704  14.621079 -20.601407
      
      print(df.iloc[2,1])  # 通过索引取值 == df.values[2,1]
      
      -2.493703754774101
      
      print(df.iloc[1:4,1:4]) # 行:取第二行到第四行  ; 列:取第二列到第四列
      
                         c2         c3         c4
      2019-01-02 -23.015387  17.448118  -7.612069
      2019-01-03  -2.493704  14.621079 -20.601407
      2019-01-04  -3.840544  11.337694 -10.998913
      
    • 使用逻辑判断取值

      print(df[df['c1']>0]) # df['c1']>0 取c1列里面大于0的值
      
                         c1         c2         c3         c4
      2019-01-01  16.243454  -6.117564  -5.281718 -10.729686
      2019-01-02   8.654076 -23.015387  17.448118  -7.612069
      2019-01-03   3.190391  -2.493704  14.621079 -20.601407
      

    读取CSV文件

    from io import StringIO
    import pandas as pd
    
    test_data = '''
    5.1,,1.4,0.2
    4.9,3.0,1.4,0.2
    4.7,3.2,,0.2
    7.0,3.2,4.7,1.4
    6.4,3.2,4.5,1.5
    6.9,3.1,4.9,
    ,,,
    '''
    
    test_data = StringIO(test_data) # 将数据写入内存
    df = pd.read_csv(test_data)
    df.columns =['c1','c2','c3','c4']
    print(df)
    
    
     c1   c2   c3   c4
    0  4.9  3.0  1.4  0.2
    1  4.7  3.2  NaN  0.2
    2  7.0  3.2  4.7  1.4
    3  6.4  3.2  4.5  1.5
    4  6.9  3.1  4.9  NaN
    5  NaN  NaN  NaN  NaN
    

    处理丢失数据

    print(df.isnull())
    
    print(df.isnull().sum())  # 通过isnull()方法后使用sum()方法即可获得该数据集某个特征含有多少个缺失值。
    
      c1     c2     c3     c4
    0  False  False  False  False
    1  False  False   True  False
    2  False  False  False  False
    3  False  False  False  False
    4  False  False  False   True
    5   True   True   True   True
    
    c1    1
    c2    1
    c3    2
    c4    2
    dtype: int64
    
    print(df.dropna(axis=0)) #axis=0会删除有Nan值的行
    
        c1   c2   c3   c4
    0  4.9  3.0  1.4  0.2
    2  7.0  3.2  4.7  1.4
    3  6.4  3.2  4.5  1.5
    
    print(df.dropna(axis=1)) #axis=1会删除有Nan值的列
    
    Empty DataFrame
    Columns: []
    Index: [0, 1, 2, 3, 4, 5]
    
    print(df.dropna(how='all')) #删除全为NaN值得行或列
    
    c1   c2   c3   c4
    0  4.9  3.0  1.4  0.2
    1  4.7  3.2  NaN  0.2
    2  7.0  3.2  4.7  1.4
    3  6.4  3.2  4.5  1.5
    4  6.9  3.1  4.9  NaN
    
  • 相关阅读:
    win10 ObservableCollection 排序自动收缩问题
    在C#中GUID生成的四种格式
    MultiBinding的StringFormat参数问题
    asp.net mvc cookie超时返回登录页面问题
    string.Format的困惑
    c# web应用调试开启外部访问
    主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等
    优化MD5和IP在(MySQL)数据库中的存储
    《Effective MySQL之SQL语句最优化》读书笔记——乱七八糟系列(给自己看)
    布隆过滤器(Bloom Filter)文章收集
  • 原文地址:https://www.cnblogs.com/raynduan/p/11079172.html
Copyright © 2020-2023  润新知