• 【ML】Numpy & Pandas的学习


    【ML】Numpy & Pandas的学习

    安装numpy和pandas

    我就直接简单的pip3 install numpypip3 install pandas就完事了

    最新的python3版本貌似自带?我也没注意…

    numpy的简单使用

    初识array

    import numpy as np
    
    array = np.array(
        [
            [1, 2, 3],
            [4, 5, 6]
        ]
    )
    
    print(array)
    print("dim --> ", array.ndim)
    print("shape --> ", array.shape)
    print("size --> ", array.size)
    '''
        [[1 2 3] 
         [4 5 6]]
        dim -->  2       
        shape -->  (2, 3)
        size -->  6  
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    dim是array的维度,shape是array的行、列信息,size是array的大小

    更多的array方法

    import numpy as np
    
    arr1 = np.array([114,514], dtype=np.int64)  # 数据类型为int64
    arr2 = np.array([114,514], dtype=np.float64)# 数据类型为float64
    
    arr_zero = np.zeros((3,4))  # 3行4列的空array
    arr_empty = np.empty((3,4)) # 3行4列的近似于空的array
    
    arr_range = np.arange(10,20,2)  # 和python中原生的range类似,左闭右开,第三个参数是间隔
    
    arr_reshape = np.arange(12).reshape((3,4))  # 将1行重新生成为3行4列
    
    arr_line = np.linspace(1, 10, 5)    # 生成线段
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    array的基础运算

    加减法、判断、矩阵乘法、随机生成以及一些方法

    import numpy as np
    
    a = np.array([114, 514, 1919, 810])
    b = np.arange(4)
    
    print(a + b)
    print(a - b)
    print(a * b)
    print(10*np.cos(a))
    print(b < 3)            # 判断是否其中小于3
    print(b == 3)           # 判断其中是否等于3
    
    a = np.array([[114,514],[1919,810]])
    b = np.arange(10,14).reshape(2,2)
    print(a * b)        # 普通一一对应相乘
    print(np.dot(a,b) == a.dot(b))  # 矩阵乘法
    
    a = np.random.random((2,4)) # random模块下的random方法
    
    print(a)
    print(np.sum(a,axis=1))     # 每一行求和
    print(np.min(a,axis=0))     # 每一列取最小
    print(np.max(a,axis=1))     # 每一行取最大
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    matrix的基础运算

    import numpy as np
    
    a = np.arange(2,14).reshape((3,4))
    
    print(a)
    print(np.argmin(a)) # 找到最小值的下标
    print(np.argmax(a)) # 找到最大值的下标
    print(np.median(a)) # 找到中位数
    print(np.cumsum(a)) # 累加(前缀和)
    print(np.diff(a))   # 累差
    print(np.nonzero(a))# 不为0的数的坐标
    print(np.sort(a))   # 排序
    
    a = np.arange(14,2,-1).reshape(3,4)
    print(a)
    print(np.transpose(a))# 矩阵的反向(对称轴反向)
    print((a.T).dot(a)) # a.T就是矩阵的反向,dot是矩阵的乘法
    print(np.clip(a,5,9))   # 让a的区间在[5,9]之间,超过这个区间的,取5或者9
    
    a = np.arange(14,2,-1).reshape(3,4)
    print(a)
    print(np.mean(a,axis=0)) # 列的平均值
    print(np.mean(a,axis=1)) # 行的平均值
    print(np.mean(a))   # 所有的平均值
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    array中的迭代与位置

    import numpy as np
    
    a = np.arange(3,15).reshape(3,4)
    
    print(a)
    
    print(a[1][1] == a[1,1])    # 可以使用列表的形式
    print(a[1,1:])   # 可以使用切片
    print(a[2][3:4])    # 同理
    
    # 迭代行
    for row in a:
        print(row)
    
    print(a.T)  # 矩阵反转
    # 通过矩阵反转,迭代列
    for col in a.T:
        print(col)
    
    print(a.flatten())  # 平展化
    # 迭代每个item
    for item in a.flat:
        print(item)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    array中的维度合并

    import numpy as np
    
    a = np.array([1, 1, 4])
    b = np.array([5, 1, 4])
    c = np.array([19, 19, 8])
    
    # 垂直合并
    print(np.vstack((a, b, c)))   # vertical stack
    
    # 左右合并
    print(np.hstack((a, b, c)))   # horizontal stack
    
    print(a.T)
    print(np.array(([1], [1], [4])))  # 无法使用矩阵反转将一个v向矩阵转为h向矩阵
    
    print(a[np.newaxis, :])  # 在 行上 加了一个维度
    print(a[:, np.newaxis])  # 在 列上 加了一个维度
    
    print(a[:, np.newaxis] == np.array(([1], [1], [4])))   # 这样就实现了相等
    
    print(np.concatenate(
        (a[np.newaxis, :], b[np.newaxis, :], c[np.newaxis, :]), axis=0))    # v向
    print(np.concatenate(
        (a[np.newaxis, :], b[np.newaxis, :], c[np.newaxis, :]), axis=1))  # h向
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    array的分割

    import numpy as np
    
    a = np.arange(12).reshape((3, 4))
    print(a)
    '''
        [[ 0  1  2  3]
        [ 4  5  6  7]
        [ 8  9 10 11]]
    '''
    
    print(np.split(a, 2, axis=1))   # 对 列 进行切割,切割成2块
    
    '''
        [array([[0, 1],
            [4, 5],
            [8, 9]]), 
        array([[ 2,  3],
            [ 6,  7],
            [10, 11]])]
    '''
    
    print(np.split(a, 3, axis=0))  # 对 行 进行切割,切割成3块
    
    '''
        [array([[0, 1, 2, 3]]), 
        array([[4, 5, 6, 7]]), 
        array([[ 8,  9, 10, 11]])]
    '''
    
    print(np.array_split(a, 3, axis=1))   # 使用array_split进行不等项分割
    
    '''
        [array([[0, 1],
            [4, 5],
            [8, 9]]), 
        array([[ 2],
            [ 6],
            [10]]), 
        array([[ 3],
            [ 7],
            [11]])]
    '''
    
    print(np.vsplit(a,3))   # v向分割 axis=0
    
    '''
        [array([[0, 1, 2, 3]]), 
        array([[4, 5, 6, 7]]), 
        array([[ 8,  9, 10, 11]])]
    '''
    
    print(np.hsplit(a,2))   # h向分割 axis=1
    '''
        [array([[0, 1],
           [4, 5],
           [8, 9]]), 
        array([[ 2,  3],
           [ 6,  7],
           [10, 11]])]
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    copy、deep copy

    import numpy as np
    
    a = np.arange(4)
    print(a)
    
    b = a   # b就是a
    print(b is a)
    c = b
    print(c is a)
    a[0] = 11
    
    print(a)
    print(b)    # a和b相等,完全相等
    print(c)    # 同样的,c和b和a完全相同
    
    d = np.copy(a)  # 拷贝
    print(d)
    d[1:3] = [114,514] 
    print(d is a)   # d不是a,改变d不会改变a
    print(d)
    print(a)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    pandas的简单使用

    pandas的使用一般配合numpy一起使用

    初识pandas

    在pandas中,可以使用Series方法来进行数据的处理,表示一串连续的数据

    可以使用DataFrame方法来进行表格数据的处理(二维)

    import numpy as np
    import pandas as pd
    
    s = pd.Series([1,919,810, np.nan, 114,514])
    print(s)    # 默认是float64形式
    
    dates = pd.date_range('20221102',periods=6) # 日期,时限为六天
    print(dates)
    
    # 随机生成一个6行四列的表格数据,行列可以进行指示
    df = pd.DataFrame(np.random.randn(6,4),index = dates, columns=['1','2','3','4'])
    print(df)
    '''
                        1         2         3         4
        2022-11-02 -0.321048  0.295775 -1.901901  0.251561
        2022-11-03  0.823800  1.705003  0.783017  0.742216
        2022-11-04  0.572487 -2.251691  1.047995 -0.334308
        2022-11-05 -1.153551  0.592805  1.294137  0.870890
        2022-11-06 -0.725959 -0.568566  0.112640  0.302099
        2022-11-07 -0.019136 -0.760683 -1.105404 -0.975848
    '''
    
    df = pd.DataFrame(np.random.randn(6,4))
    print(df)   # 默认名称
    '''
                0         1         2         3
        0  1.061890  0.443764  0.511670 -1.415818
        1 -0.605931 -0.488900 -0.492849 -0.930321
        2  1.276535  0.345806  0.193465  1.016358
        3  0.038369 -0.218895  1.001611  0.505635
        4  1.168394  0.933190 -0.794221  0.719631
        5  0.572634 -0.713252  0.276506 -0.991942
    '''
    
    print(df)
    print(df.dtypes)    # 数据的类型
    print(df.index)     # 行序号
    print(df.columns)   # 列序号
    print(df.values)    # 所有有效值
    print(df.describe())# 所有的列的描述,只能描述数字类型
    print(df.T) # 和numpy中一样。矩阵反转
    print(df.sort_index(axis=1,ascending=False))    # sort_index表示对下标排序,可以指定是行还是列 axis = 1 对行进行排序,ascending = False 表示倒叙 
    '''
                3         2         1         0
        0 -0.834417 -0.259117  0.678874  0.585828
        1  0.049437  0.406795  0.121693 -0.911248
        2 -0.016904 -1.064432  1.162741 -0.021980
        3  0.178585 -0.035309  0.687608 -0.086795
        4  0.124227  2.161858  0.270373  1.135770
        5 -0.971254  1.105907  0.589002  0.417444
    '''
    print(df.sort_index(axis=0,ascending=False))    # axis = 0 对行进列排序,ascending = False 表示倒叙 
    '''
                0         1         2         3
        5  0.417444  0.589002  1.105907 -0.971254
        4  1.135770  0.270373  2.161858  0.124227
        3 -0.086795  0.687608 -0.035309  0.178585
        2 -0.021980  1.162741 -1.064432 -0.016904
        1 -0.911248  0.121693  0.406795  0.049437
        0  0.585828  0.678874 -0.259117 -0.834417
    '''
    
    print(df.sort_values(by=3)) # by=3 表示以列为 3 的数据为基准,进行排序,默认从小到大
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    读取数值

    一般使用如下三种方法来获取数据

    1. 切片或属性
    2. loc
    3. iloc
    4. boolean判断
    import numpy as np
    import pandas as pd
    
    line_split = lambda: print("-"*50)
    
    dates = pd.date_range("20220701", periods=6)
    df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=["A", "B", "C", "D"])
    print(df)
    line_split()
    
    # 使用切片或者属性进行读取
    print(df['A'] == df.A)  # 可以使用数组的方式,也可以使用属性的方式,获取一列的数值
    line_split()
    
    print(df[0:3] == df['20220701':'20220703'])  # 可以使用切片,也可以使用标签指定形式
    line_split()
    
    # 使用loc方法,相当于 select by label
    print(df.loc["20220701"])   # 获取某行的数值
    line_split()
    
    print(df.loc[:, ['A', 'B']])  # 获取A,B两列的所有数据
    line_split()
    
    # 使用iloc方法,相当于 select by position
    print(df.iloc[0, 0])  # 第0行的第0列数据
    line_split()
    
    print(df.iloc[3:5, 1:3])    # 第3、4行的第1、2列数据(切片形式)
    line_split()
    
    print(df.iloc[[1,3,4],1:3]) # 不连续的获取数据,获取第1、3、4行的第1、2列数据
    line_split()
    
    # 使用判断方法
    print(df[df['A'] > 8])  # A列中数据 > 8 的所有数据
    line_split()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    覆写数据

    使用上述的读取数据的方法然后进行赋值就可以进行覆写数据的操作了

    可以使用dropna方法来进行数据丢弃nan数据,使用fillna方法来进行填充nan数据

    import numpy as np
    import pandas as pd
    
    line_split = lambda: print("-"*50)
    
    dates = pd.date_range("20220701", periods=6)
    df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=["A", "B", "C", "D"])
    
    # 使用iloc方法进行修改值
    df.iloc[2,2] = 114514   # index指定位置
    
    # 使用loc方法进行修改值
    df.loc['20220702','A'] = 1919810   # 行列指定位置
    
    # 使用boolean判断方法进行修改
    df.A[df.A > 12] = 0    # 将A列中大于12的值改为0
    
    # 直接赋值
    df.D = np.nan   # 将D列全部赋值为nan
    df.C = pd.Series([1,1,4,5,1,4],index = dates)   # 将C列转为我们新写的series
    
    print(df)
    line_split()
    
    '''
                    A   B  C   D
        2022-07-01   0   1  1 NaN
        2022-07-02   0   5  1 NaN
        2022-07-03   8   9  4 NaN
        2022-07-04  12  13  5 NaN
        2022-07-05   0  17  1 NaN
        2022-07-06   0  21  4 NaN
    '''
    
    
    print(df.dropna(axis=1,how="all"))    # 对列下标进行丢弃,是nan就丢弃,how="all" 表示只有一行中全是nan才丢弃,how = "any"表示只要存在nan就丢弃(这里丢弃了D列)
    line_split()
    '''
                    A   B  C
        2022-07-01   0   1  1
        2022-07-02   0   5  1
        2022-07-03   8   9  4
        2022-07-04  12  13  5
        2022-07-05   0  17  1
        2022-07-06   0  21  4
    '''
    
    print(df.fillna(value=114514))  # 对nan数据进行填充
    line_split()
    
    print(df.isnull())    # 判断数据是否缺失
    line_split()
    
    print(np.any(df.isnull()) == True)  # 是否至少存在一个nan, np.any方法可以对所有元素进行或运算,存在True就返回True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    concat合并数据

    import numpy as np
    import pandas as pd
    
    line_split = lambda: print("-"*50)
    
    df1 = pd.DataFrame(np.ones((3,4))*0,columns=["a","b","c","d"])
    df2 = pd.DataFrame(np.ones((3,4))*1,columns=["a","b","c","d"])
    df3 = pd.DataFrame(np.ones((3,4))*2,columns=["a","b","c","d"])
    
    print(df1)
    line_split()
    print(df2)
    line_split()
    print(df3)
    line_split()
    
    # 普通合并
    print(pd.concat([df1,df2,df3], axis=0, ignore_index=True)) # 在 行上 合并, ignore_index=True 表示忽略下标
    line_split()
    print(pd.concat([df1,df2,df3],axis=1))  # 在 列上 合并
    line_split()
    
    # 内连接、外连接, concat方法默认是outer模式
    df1 = pd.DataFrame(np.ones((3,4))*0,columns=["a","b","c","d"],index=[1,2,3])
    df2 = pd.DataFrame(np.ones((3,4))*1,columns=["b","c","d","e"], index=[2,3,4])
    print(pd.concat([df1,df2],join="inner",ignore_index=True))    # 使用内连接,只考虑双方都有的columns
    line_split()
    
    # append的方式添加
    s1 = pd.Series([1,3,4,5],index=['a','b','c','d'])
    print(df1.append([s1]*10,ignore_index=True))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    merge合并数据

    merge就是两个数据表进行合并,可以使用inner outer right left的方式进行合并

    import numpy as np
    import pandas as pd
    
    def line_split(): return print("-"*50)
    
    
    l = pd.DataFrame(
        {
            'key': ["K0", "K1", "K2", "K3"],
            "A": ["A0", "A1", "A2", "A3"],
            "B": ["B0", "B1", "B2", "B3"]
        },
        index=["3","4","5","6"]
    )
    
    r = pd.DataFrame(
        {
            'key': ["K0", "K1", "K2", "K3"],
            "C": ["C0", "C1", "C2", "C3"],
            "D": ["D0", "D1", "D2", "D3"],
           
        },
        index=["1","2","3","4"]
    )
    
    print(l)
    line_split()
    print(r)
    line_split()
    
    # 合并两个dataframe,通过一个键
    print(pd.merge(l, r, on="key"))   # on = "key" 表示 基于 key 这一列进行合并
    line_split()
    
    print(pd.merge(l,r,left_index=True,right_index=True,how="outer",indicator=True))    # left_index = True, right_index = True 表示基于两者的index进行合并
    line_split()
    
    l = pd.DataFrame(
        {
            'key1': ["K0", "K1", "K2", "K3"],
            'key2': ["K1", "K1", "K4", "K5"],
            "A": ["A0", "A1", "A2", "A3"],
            "B": ["B0", "B1", "B2", "B3"]
        }
    )
    
    r = pd.DataFrame(
        {
            'key1': ["K0", "K1", "K2", "K3"],
            'key2': ["K1", "K9", "K1", "K9"],
            "C": ["C0", "C1", "C2", "C3"],
            "D": ["D0", "D1", "D2", "D3"]
        }
    )
    # 不同的连接方式
    print(pd.merge(l, r, on=["key1","key2"],how="inner"))   # 默认是 inner合并,也就是交集
    line_split()
    
    print(pd.merge(l, r, on=["key1","key2"],how="outer"))   # outer合并,也就是并集
    line_split()
    
    print(pd.merge(l, r, on=["key1","key2"],how="left"))    # 左连接
    line_split()
    
    print(pd.merge(l, r, on=["key1","key2"],how="right",indicator=True))   # 右连接, indicator可以显示合并方式
    line_split()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
  • 相关阅读:
    【自学笔记】如何在 Python 中使用 YAML 文件? 了解 YAML 格式和规范
    关于使用命令行 cf login 登录 SAP BTP CloudFoundry 环境的问题
    Nginx+keepalived 高可用双机热备—双主模式
    常用设计模式
    线程池(治理线程的法宝)
    基于微信小程序的大学生科技竞赛竞技报名系统设计与实现(源码+lw+部署文档+讲解等)
    Win10离线安装choco方案
    【毕业设计-教程】红外控制原理详解 - 单片机嵌入式 物联网 stm32 c51
    CppCheck
    JVM运行时数据区域详解
  • 原文地址:https://blog.csdn.net/woodwhale/article/details/125597861