• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Numpy和amp;pandas基本使用方法(机器学习入门)

武飞扬头像
_Brooke_
帮助1

目录

一、Numpy

        1.初识ndarray对象(同类型数据的集合)

         2.创建一个ndarray对象

         3.数据类型:

         4.用dtype生成数据类型对象

         5.创建数组/矩阵

                ①numpy.empty()

                  ②numpy.zeros

                ③ numpy.ones

                 ④numpy.arange

                ⑤ numpy.asarray

                ⑥ numpy.frombuffer

                 ⑦利用numpy.random模块生成数组

        6.切片和索引

                ①NumPy 切片

                        法一:使用slice函数进行切片编辑

                         法二:直接使用下标索引

                   补充:视图和副本

                ② Numpy索引

                        法一:使用索引数组进行索引访问

                         法二:布尔索引

                         法三:花式索引        

        7.Numpy数组运算和操作

                ①修改数组形状

                         (a)numpy.reshape

                         (b) numpy.ndarray.flatten

                 ②矩阵的转置:

                               numpy.transpose

                ③修改数组维度

                         (a)numpy.expand_dims

                         (b)numpy.squeeze

                ④连接数组 

                         (a)numpy.concatenate

                         (b)numpy.stack

                ⑧分隔数组

                        numpy.split

                   ⑨数组元素的添加与删除

                        (a)numpy.resize

                         (b)numpy.append

                         (c)numpy.insert

                         (d)numpy.delete

                        (e) numpy.unique

         8.Numpy基本计算&数组统计计算

                ①基本计算

                ②数组统计计算

         9.广播机制介绍:

                ①广播的原则:

                ②例子

         10.深浅拷贝问题

                        ①无拷贝:(相当于引用!)

                        ②视图or浅拷贝

                        ③副本or深拷贝 

二、pandas

        1.数据结构:

                ①Series

                        (a)创建

                        (b)切片和索引

                        (c)Series与Dict编辑

                        (d)基本运算 * / 等同numpy

                        (e)自动对齐编辑

                         (f)缺失值检测 

                           (G)name属性 &index、values属性  

                ② DataFrame

                      (A)创建编辑

                      (B)基本属性与整体情况查询

                        (C)索引 

                                (i)常规使用ndarray式的索引方法

                                (ii) 使用 .loc ->根据index和column名进行操作,.loc[...]

                                (iii)使用 .iloc

                                (iv)布尔值索引 

                      (D)层次化索引 

                                   (i) Series 层次化索引

                                     (ii) DataFrame 层次化索引

                          (E)数据的合并 

                                         (i)merge共同列

                                         (ii)Join:更为方便的实现行索引上的合并

                          (F)分割与组合

        2.读写数据

                ①read_csv   编辑

                ②read_table编辑

                ③ to_csv编辑

        3.缺失值数据处理

        4. 数据特征分析

                ①排序

                        sort_index方法

                        sort_values 方法

                ②.基本统计数据

                ③.累计统计数据

                ④.相关性分析

一、Numpy

        1.初识ndarray对象(同类型数据的集合)

                学新通

         2.创建一个ndarray对象学新通

 学新通

         3.数据类型:学新通

         4.用dtype生成数据类型对象

学新通

 对于组合数据类型

学新通

 例:将构成一个学生整体的数据类型对象学新通

学新通

         5.创建数组/矩阵

                ①numpy.empty()学新通

学新通

学新通

                  ②numpy.zeros

学新通

学新通

学新通

                ③ numpy.ones学新通

学新通

                 numpy.ones_like()学新通

                 ④numpy.arange

学新通学新通

#注意:对于浮点参数(参数为浮点),结果的长度为(stop - start)/ step)由于浮点溢出,此规则可能导致最后一个元素大于stop。因此要特别注意

                ⑤ numpy.asarray学新通

  1.  
    import numpy as np
  2.  
    [in]: a = [1, 2, 3, 4]
  3.  
    [in]: new_arr = np.asarray(a)
  4.  
    [in]: print(new_arr)
  5.  
    [out]: [1 2 3 4]
  6.  
     
  7.  
    [in]: new_arr = np.asarray(a , dtype=np.float32)
  8.  
    [in]: print(new_arr)
  9.  
    [out]: [1. 2. 3. 4.]

                ⑥ numpy.frombuffer

                        numpy.frombuffer 用于实现动态数组,将数据以流的形式读入转化成ndarray对象 

  1.  
    import numpy as np
  2.  
     
  3.  
    [in]: s = b'Hello World' #buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b
  4.  
    [in]: a = np.frombuffer(s, dtype = 'S1')
  5.  
    [in]: print (a)
  6.  
    [out]: [b'H' b'e' b'l' b'l' b'o' b' ' b'W' b'o' b'r' b'l' b'd']

学新通

                 ⑦利用numpy.random模块生成数组

总体来说,numpy.random模块分为四个部分,对应四种功能:

  • 简单随机数: 产生简单的随机数据,可以是任何维度

  • 排列:将所给对象随机排列

  • 分布:产生指定分布的数据,如高斯分布等

  • 生成器:种随机数种子,根据同一种子产生的随机数是相同的

 学新通

学新通

        6.切片和索引

                ①NumPy 切片

                        法一:使用slice函数进行切片学新通

 相当于就是将slice的第一个参数当做切片的start,第二个参数当做切片的end,第三个参数当做切片的步长

                         法二:直接使用下标索引

对于一维数组(直接当做list看)

  1.  
    [in]: x = np.arange(10)
  2.  
    [in]: y = x[2:8:3]
  3.  
    [in]: print(y)
[out]: [2 5]

推广至二维:(中间利用逗号,进行分隔,第一部分参数是表示第一个维度,第二部分参数表示第二个维度),根据axis总结的相关知识,第一个维度管理的是沿着其变化方向如(0,0)->(1,0)可知,第一个维度管理的是每一层,所以此处对每一层是不会进行切割处理的。同理,我们看第二个维度,(0,0)->(0,1)沿着列方向向下变化,管理每一个列,于是切割到只剩下index=2的一列

axis维度的相关讲解

学新通

学新通                 补充:视图和副本

python的 list 切片返回是原数据的副本,即开辟了一个新的内存地址储存数据,因此修改切片出来的结果,原数据并不会发生改变。

numpy 以效率为主,所以 numpy 的切片返回的是原数据的视图,即不会创建新的内存地址,而是对原数据内存地址的引用。所以对numpy 切片结果进行修改会发现,原数据也一起发生了改变。

注意:numpy 中所有的运算操作符都不会为数组创建副本

  1.  
    [in]: x = np.arange(1,10).reshape(3,-1) #创建一个3 * 3大小的二维数组
  2.  
    #解释一下,上行代码的-1的作用:前面生成9个元素,axis=1位置-1自动9/3=3
  3.  
    [in]: print(x)
  4.  
    [out]: [[1 2 3]
  5.  
    [4 5 6]
  6.  
    [7 8 9]]
  7.  
     
  8.  
    [in]: y = x[:2,:2]
  9.  
    [in]: print(y)
  10.  
    [out]: [[1 2]
  11.  
    [4 5]]
  12.  
     
  13.  
    [in]: y[1,1] = 999
  14.  
    [in]: print(y)
  15.  
    [out]: [[ 1 2]
  16.  
    [ 4 999]]
  17.  
     
  18.  
    [in]: print(x)
  19.  
    [out]: [[ 1 2 3]
  20.  
    [ 4 999 6]
  21.  
    [ 7 8 9]]

                ② Numpy索引

                        法一使用索引数组进行索引访问

        注意:对于索引数组的所有情况,返回的是原始数据的副本,而不是切片获取的视图

  1.  
    # x = [10 9 8 7 6 5 4 3 2]
  2.  
    [in]: y = x[np.array([3,3,-3,8])]
  3.  
    [in]: print(y)
  4.  
    [out]: [7 7 4 2]

推广至多维:(np.array中的元素构成单一索引值一个一个地映射到x中,并进行相应的替换。)

  1.  
    # x = [10 9 8 7 6 5 4 3 2]
  2.  
    [in]: y = x[np.array([[1,1],[2,3]])]
  3.  
    [in]: print(y)
  4.  
    [out]: array([[9, 9],
  5.  
    [8, 7]])

 验证索引用的是副本,而不是视图!!!学新通

                         很显然92没有被改变学新通

                         法二布尔索引学新通

学新通

 推广至二维:

学新通

 学新通

                         法三花式索引        

学新通

广播机制的应用:

Numpy 的广播机制先将[2]变成[2, 2],然后再拼接成相应的下标 arr[0, 2] 和 arr[1, 2] 。 

学新通学新通

 其他例子:

学新通

In a nutshell: 

 学新通

        7.Numpy数组运算和操作

                ①修改数组形状学新通

                         (a)numpy.reshape学新通

 学新通

                        (b) numpy.ndarray.flatten

学新通

 学新通

                 ②矩阵的转置:

学新通

                        (a) numpy.transpose学新通

学新通

                ③修改数组维度 学新通

                         (a)numpy.expand_dims学新通

                         (b)numpy.squeeze学新通

                ④连接数组 学新通

                         (a)numpy.concatenate学新通

                         (b)numpy.stack

学新通

  1.  
    import numpy
  2.  
     
  3.  
    arr_1 = numpy.arange(1, 7).reshape((2, 3))
  4.  
    arr_2 = numpy.arange(7, 13).reshape((2, 3))
  5.  
    arr_3 = numpy.arange(13, 19).reshape((2, 3))
  6.  
    arr_4 = numpy.arange(19, 25).reshape((2, 3))
  7.  
     
  8.  
    print(numpy.stack([arr_1, arr_2, arr_3, arr_4], axis=0))
  9.  
    print(numpy.stack([arr_1, arr_2, arr_3, arr_4], axis=0).shape)
  10.  
     
  11.  
    print(numpy.stack([arr_1, arr_2, arr_3, arr_4], axis=1))
  12.  
    print(numpy.stack([arr_1, arr_2, arr_3, arr_4], axis=1).shape)
  13.  
     
  14.  
    print(numpy.stack([arr_1, arr_2, arr_3, arr_4], axis=2))
  15.  
    print(numpy.stack([arr_1, arr_2, arr_3, arr_4], axis=2).shape)

输出:

 学新通

需要注意的是:axis 等于几就说明在哪个维度上进行堆叠。

当 axis=0 的时候,意味着整体,也就是一个2行3列的数组。所以对于0维堆叠,相当于简单的物理罗列,比如这四个数组代表的是4张图像的数据,进行0维堆叠也就是把它们按顺序排放了起来,形成了一个(4,2,3)的3维数组。

当 axis=1 的时候,意味着第一个维度,也就是数组的每一行。所以对于1维堆叠,4个2行3列的数组,各自拿出自己的第一行数据进行堆叠形成3维数组的第一“行”,各自拿出自己的第二行数据进行堆叠形成3维数组的第二“行”,从而形成了一个(2,4,3)的3维数组。

当 axis=2 的时候,意味着第二个维度,注意:千万不要理解成2维堆叠是对每一列拿出来进行堆叠!这个堆叠是对于整个维度来讲的,我们把一维空间理解为一条线,而二维空间则是一个平面。从第二个维度堆叠可以看作平面与平面的堆叠。

 学新通

                ⑧分隔数组 学新通

                        numpy.split学新通

  1.  
    import numpy as np
  2.  
     
  3.  
    arr = np.arange(9)
  4.  
    print(arr)
  5.  
     
  6.  
    arr_1 = np.split(arr, 3)
  7.  
    arr_2 = np.split(arr, [4, 7])
  8.  
    print(arr_1)
  9.  
    print(arr_2)
  10.  
     
  11.  
    '''output:
  12.  
    [0 1 2 3 4 5 6 7 8]
  13.  
    [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
  14.  
    [array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]

                   ⑨数组元素的添加与删除学新通

                       a)numpy.resize学新通 

                         (b)numpy.append学新通

                         (c)numpy.insert学新通

                         (d)numpy.delete

 学新通

                        (e) numpy.unique

学新通

         8.Numpy基本计算&数组统计计算

                ①基本计算

学新通学新通

对应位置,依次进行相关的操作!!! 

                        ②数组统计计算学新通

学新通

学新通

 学新通

学新通

         9.广播机制介绍:

                ①广播的原则:

                如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。

                通俗的解释一下就是广播机制可以在两种情况下作用,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符(其实就是从后数的连续若干个维度数都相同),另外一种是有一方的长度为1(其实就是如果从后数有维度不同,但是维度大小为1时,广播机制同样可以发挥作用)。

                ②例子

                (a)后锥维度的轴长相符

学新通

 学新通

                        (b) 后缘维度不全相同,有一方长度为1学新通

                         (c)反例学新通

                10.深浅拷贝问题

        NumPy 的 copy 操作分为三种:无拷贝、浅拷贝、深拷贝。每种拷贝方式的机制和内存操作有所区别,可以联系到我们之前学过的视图和副本的内容,如果使用不当可以浪费大量内存,因此要理解操作中的各种行为,根据实际情况选择最合理的方法。

                        ①无拷贝:(相当于引用!)学新通

                         ②视图or浅拷贝学新通

学新通

 可以看到 a 和 b 并不同属一块内存,是两个不同的对象。然而对 b 的修改会改变 a ,证明其实浅拷贝操作还是共用的一个底层数据。

虽然改b的值会同步更新到a,但是改动b的形状是不会反映到a的!!!

                        ③副本or深拷贝 学新通

二、pandas

        1.数据结构:

                ①Series

                         (a)创建

  1.  
    #1.从列表创建
  2.  
    s1 = pd.Series([1, 2, 3, 4, 5])
  3.  
    #2.从 ndarray 创建
  4.  
    s2 = pd.Series(np.arange(5), index=['a','b','c','d','e'])
  5.  
    #3.从字典创建
  6.  
    temp_dict = {"name": "zhangsan", "age": 27, "tel": 10086}
  7.  
    s3 = pd.Series(temp_dict)
  8.  
    #4.从标量值构造
  9.  
    s4 = pd.Series(1., index=list("abcde"))

输出: 学新通学新通学新通学新通

                        (b)切片和索引

学新通

                                 (c)Series与Dict学新通

学新通

                                 (d)基本运算 * / 等同numpy

                                 (e)自动对齐学新通

对于上面两个不能完全对齐的 Series,结果的 index 是两者的并集,同时不能对齐的部分当作缺失值处理. 

                                (f)缺失值检测 

学新通

  1.  
    # 创建一个带缺失值Series
  2.  
    s = pd.Series([1, 2, None, 4, None])
  3.  
    # 检测缺失值
  4.  
    print(s.isna())
  5.  
    '''Output:
  6.  
    0 False
  7.  
    1 False
  8.  
    2 True
  9.  
    3 False
  10.  
    4 True
  11.  
    dtype: bool'''
  12.  
    # 填充缺失值,填充值为0.
  13.  
    print(s.fillna(0.))
  14.  
    '''Output:
  15.  
    0 1.0
  16.  
    1 2.0
  17.  
    2 0.0
  18.  
    3 4.0
  19.  
    4 0.0
  20.  
    dtype: float64'''

                                (G)name属性 &index、values属性  

                                (i)可以在定义时指定 name 属性:

  1.  
    s = pd.Series(np.arange(5), name="something")
  2.  
    print(s.name)
  3.  
    '''[out]:
  4.  
    something'''

                                 (ii)通过 Series.index 查看索引, 通过 values 查看值

  1.  
    s = pd.Series(np.arange(5), index=list("abcde"))
  2.  
    print(s.index)
  3.  
    '''[out]:
  4.  
    Index(['a', 'b', 'c', 'd', 'e'], dtype='object')'''
  5.  
    print(s.values)
  6.  
    '''[out]:
  7.  
    [0 1 2 3 4]'''

                ② DataFrame

DataFrame 是 pandas 中的二维数据结构,可以看成一个 Excel 中的工作表,或者一个 SQL 表,或者一个存储Series 对象的字典,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。

DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引),其中的 index用于指定行的 label,columns 用于指定列的 label ,如果参数不传入,那么会按照传入的内容进行设定。

                        (a)创建学新通

 两大类创建方式(①从列表(单个 嵌套)②从字典(数组or列表))

  1.  
    #1.1使用单个列表创建
  2.  
    data = [1, 2, 3, 4, 5]
  3.  
    df = pd.DataFrame(data)
  4.  
    print(df)
  5.  
    '''[out]:
  6.  
    0
  7.  
    0 1
  8.  
    1 2
  9.  
    2 3
  10.  
    3 4
  11.  
    4 5'''
  12.  
    #1.2使用嵌套列表创建并指定列索引
  13.  
    data = [['xiaoming', 10], ['xiaohong', 11], ['xiaozhang', 12]]
  14.  
    df = pd.DataFrame(data, columns=['Name', 'Age'])
  15.  
    print(df)
  16.  
    '''[out]:
  17.  
    Name Age
  18.  
    0 xiaoming 10
  19.  
    1 xiaohong 11
  20.  
    2 xiaozhang 12'''
  21.  
    #2.1从字典使用数组创建->注意:两个数据的长度必须一样
  22.  
    data = {'Name': ['xiaoming', 'zhangsan', 'lisi'], 'Age':[10, 11, 21]}
  23.  
    df = pd.DataFrame(data)
  24.  
    print(df)
  25.  
    '''[out]:
  26.  
    Name Age
  27.  
    0 xiaoming 10
  28.  
    1 zhangsan 11
  29.  
    2 lisi 21'''
  30.  
    #2.2从字典列表创建
  31.  
    #字典列表可作为输入数据传递以用来创建 DataFrame ,
  32.  
    #字典键默认为列名,缺失的部分会自动填充 NaN 值
  33.  
    data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 6, 'c': 7}]
  34.  
    df = pd.DataFrame(data, index=["first", "second"]) # 指定行索引
  35.  
    print(df)
  36.  
    '''[out]:
  37.  
    a b c
  38.  
    first 1 2 NaN
  39.  
    second 5 6 7.0'''

注:2.1的示例显然字典的键默认充当了column值!!!value 可以是各种能够转化为 Series 的对象,与 Series 要求所有的类型都一致不同,DataFrame 值要求每一列数据的格式相同->各列数据类型用下面的df.dtypes来进行查询。

                        (b)基本属性与整体情况查询

DataFrame 的基础属性

  • df.shape # 形状,行数列数
  • df.dtypes # 列数据类型
  • df.ndim # 数据维度
  • df.index # 行索引
  • df.columns # 列索引
  • df.values # 对象值,二维ndarray数组

DataFrame 整体情况查询

  • df.head() # 显示头部几行
  • df.tail() # 显示尾部几行
  • df.info() # 相关信息概览:行数,列数,列索引,列非空值个数,列类型,内存占用
  • df.describe() # 快速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值

                 describe():示例

  1.  
    print(df.describe())
  2.  
    '''[out]:
  3.  
    A B C D
  4.  
    count 6.000000 6.000000 6.000000 6.000000
  5.  
    mean 0.170426 0.204062 -0.433312 -0.112912
  6.  
    std 1.831264 0.861747 1.082089 0.861061
  7.  
    min -1.252650 -1.068945 -1.715116 -1.294911
  8.  
    25% -0.791367 -0.101212 -1.225638 -0.466866
  9.  
    50% -0.469743 0.061138 -0.342377 -0.222187
  10.  
    75% 0.156002 0.712040 -0.048075 0.193103
  11.  
    max 3.748685 1.397363 1.270031 1.278703'''

                        (C)索引 

DataFrame 支持 ndarray 的索引语法,但是推荐使用 .loc, .iloc .ix 方法进行索引。

                                 (i)常规使用ndarray式的索引方法

  1.  
    # 创建一个6行3列的正太分布结构
  2.  
    df = pd.DataFrame(np.random.randn(6,4), index=list("abcdef"),
  3.  
    columns=list('ABCD'))
  4.  
    # 创建一个3行4列的结构
  5.  
    df2 = pd.DataFrame(np.arange(12).reshape(3, 4), index=list("abc"), columns=list("WXYZ"))
  6.  
    #1.1列:读取单列
  7.  
    print(df["A"])
  8.  
    #等效于 print(df.A)
  9.  
    '''Output:
  10.  
    a -2.021650
  11.  
    b 0.259206
  12.  
    c 0.868003
  13.  
    d 0.803916
  14.  
    e -0.271057
  15.  
    f -1.251718
  16.  
    Name: A, dtype: float64'''
  17.  
    #1.2列:读取多列
  18.  
    print(df[["A", "C"]])
  19.  
    ''' Output:
  20.  
    A C
  21.  
    a -2.021650 0.659043
  22.  
    b 0.259206 -0.542967
  23.  
    c 0.868003 0.599239
  24.  
    d 0.803916 -0.207791
  25.  
    e -0.271057 -0.588037
  26.  
    f -1.251718 -2.018937'''
  27.  
    #2.1行:使用切片
  28.  
    print(df[0:3])
  29.  
    '''output:
  30.  
    A B C D
  31.  
    a -2.021650 -0.819054 0.659043 0.526803
  32.  
    b 0.259206 -3.061188 -0.542967 -0.118463
  33.  
    c 0.868003 0.460860 0.599239 1.919060'''
  34.  
    #2.2行:索引读取
  35.  
    print(df["a":"c"])
  36.  
    ''' A B C D
  37.  
    a -2.021650 -0.819054 0.659043 0.526803
  38.  
    b 0.259206 -3.061188 -0.542967 -0.118463
  39.  
    c 0.868003 0.460860 0.599239 1.919060'''
  40.  
    #3.读取多行多列也是可以的
  41.  
    print(df["a":"c"][["A", "D"]])
  42.  
    ''' A D
  43.  
    a -2.021650 0.526803
  44.  
    b 0.259206 -0.118463
  45.  
    c 0.868003 1.919060'''

                                (ii) 使用 .loc ->根据index和column名进行操作,.loc[...]

  1.  
    # 创建一个3行4列的结构
  2.  
    df2 = pd.DataFrame(np.arange(12).reshape(3, 4), index=list("abc"), columns=list("WXYZ"))
  3.  
     
  4.  
    #1单切:.loc 可以使用 label 进行索引
  5.  
    #查询单行
  6.  
    print(df2.loc["a"])
  7.  
    '''W 0
  8.  
    X 1
  9.  
    Y 2
  10.  
    Z 3
  11.  
    Name: a, dtype: int32'''
  12.  
    #查询多行
  13.  
    print(df2.loc[["a", "c"]])
  14.  
    '''W X Y Z
  15.  
    a 0 1 2 3
  16.  
    c 8 9 10 11'''
  17.  
    #2.连续切片:“,”左边为行索引,右边为列索引
  18.  
    #写法1, 离散的多行多列
  19.  
    print(df2.loc[["a", "b"], ["W", "Y"]])
  20.  
    '''W Y
  21.  
    a 0 2
  22.  
    b 4 6'''
  23.  
    #写法2,连续的多行离散的多列
  24.  
    print(df2.loc[df2.index[0:2], ["W", "Y"]])
  25.  
    '''W Y
  26.  
    a 0 2
  27.  
    b 4 6'''
  28.  
    #写法3,连续的多行多列
  29.  
    print(df2.loc["a": "c", "W": "Y"])
  30.  
    '''W X Y
  31.  
    a 0 1 2
  32.  
    b 4 5 6
  33.  
    c 8 9 10'''

注意:loc是闭区间!!!!! 

                                (iii)使用 .iloc

        根据位置(就是直接用数字(默认从0开始)切片or索引)读取

                        ,也可以进行切片  ->>>补充:.ix可以综合iloc和.loc使用

  1.  
    # 创建一个3行4列的结构
  2.  
    df2 = pd.DataFrame(np.arange(12).reshape(3, 4), index=list("abc"), columns=list("WXYZ"))
  3.  
     
  4.  
    # 获取前两行->左闭右开(注意区分)
  5.  
    print(df2.iloc[0:2])
  6.  
    ''' W X Y Z
  7.  
    a 0 1 2 3
  8.  
    b 4 5 6 7'''
  9.  
    # 获取前2行前3列
  10.  
    print(df2.iloc[0:2, 0:3])
  11.  
    ''' W X Y
  12.  
    a 0 1 2
  13.  
    b 4 5 6'''
  14.  
    # 获取所有行,前2列
  15.  
    print(df2.iloc[:, 0:2])
  16.  
    '''W X
  17.  
    a 0 1
  18.  
    b 4 5
  19.  
    c 8 9'''
  20.  
    # 获取前2行,所有列
  21.  
    print(df2.iloc[0:2, :])
  22.  
    '''W X Y Z
  23.  
    a 0 1 2 3
  24.  
    b 4 5 6 7'''

                                        (iv)布尔值索引 

  1.  
    # 创建一个6行3列的正太分布结构
  2.  
    df = pd.DataFrame(np.random.randn(6,4), index=list("abcdef"),
  3.  
    columns=list('ABCD'))
  4.  
     
  5.  
    print(df > 0)
  6.  
    '''A B C D
  7.  
    a False False True True
  8.  
    b True False False False
  9.  
    c True True True True
  10.  
    d True False False True
  11.  
    e False False False True
  12.  
    f False True False False'''
  13.  
    #获取所有 A 列大于0的行:
  14.  
    print(df['A'] > 0)
  15.  
    '''
  16.  
    a False
  17.  
    b True
  18.  
    c True
  19.  
    d True
  20.  
    e False
  21.  
    f False
  22.  
    Name: A, dtype: bool'''
  23.  
    print(df[df['A'] > 0])
  24.  
    ''' A B C D
  25.  
    b 0.259206 -3.061188 -0.542967 -0.118463
  26.  
    c 0.868003 0.460860 0.599239 1.919060
  27.  
    d 0.803916 -1.835040 -0.207791 0.445216'''
  28.  
    #也能传入多个条件,不同的条件之间需要用括号括起来
  29.  
    print(df2[(df2 > 1) & (df2 < 10)])
  30.  
    '''W X Y Z
  31.  
    a NaN NaN 2.0 3.0
  32.  
    b 4.0 5.0 6.0 7.0
  33.  
    c 8.0 9.0 NaN NaN'''

                        (D)层次化索引 

在一个轴上拥有多个索引级别,另一种说法是它能以低纬度形式来处理高纬度数据。

                                (i) Series 层次化索引

  1.  
    data = [16, 17, 21, 18, 19, 22]
  2.  
    s = pd.Series(data,
  3.  
    index=[["first", "first", "second", "second", "third", "third"],
  4.  
    ["male", "female", "male", "female", "male", "female"]])
  5.  
    print(s)
  6.  
    '''output:
  7.  
    first male 16
  8.  
    female 17
  9.  
    second male 21
  10.  
    female 18
  11.  
    third male 19
  12.  
    female 22
  13.  
    dtype: int64'''
  14.  
    # 显示层次化索引
  15.  
    print(s.index)
  16.  
    '''MultiIndex([( 'first', 'male'),
  17.  
    ( 'first', 'female'),
  18.  
    ('second', 'male'),
  19.  
    ('second', 'female'),
  20.  
    ( 'third', 'male'),
  21.  
    ( 'third', 'female')],
  22.  
    )'''

Series层次索引 应用实例:

  1.  
    #1.获取一下一班的男女生人数:
  2.  
    # 传入第一个索引
  3.  
    print(s["first"])
  4.  
    '''[out]:
  5.  
    male 16
  6.  
    female 17
  7.  
    dtype: int64'''
  8.  
    #2.获取一二班的男女生人数->层次索引的切片操作
  9.  
    print(s["first": "second"])
  10.  
    '''[out]:
  11.  
    first male 16
  12.  
    female 17
  13.  
    second male 21
  14.  
    female 18
  15.  
    dtype: int64'''
  16.  
    # 也可以多项选择
  17.  
    print(s[["first", "third"]])
  18.  
    '''[out]:
  19.  
    first male 16
  20.  
    female 17
  21.  
    third male 19
  22.  
    female 22
  23.  
    dtype: int64 '''
  24.  
    #3.获取一班的男生人数
  25.  
    #方式一:内外层结合选择
  26.  
    print(s["first", "male"])
  27.  
    #方式二:先选择外层索引,再选择内层索引
  28.  
    print(s["first"]["male"])
  29.  
    '''16'''
  30.  
    #4.获取各班的女生人数
  31.  
    #方式一:内外层结合选择
  32.  
    print(s[:, "female"])
  33.  
    #方式二:先选择外层索引,再选择内层索引
  34.  
    print(s["first": "third"][:, "female"])
  35.  
    '''[out]:
  36.  
    first 17
  37.  
    second 18
  38.  
    third 22
  39.  
    dtype: int64'''
  40.  
     

                                (ii) DataFrame 层次化索引

对于 DataFrame 来说,行和列都能进行层次化索引,也就是四个索引决定一个值,将一个二维数据变成了一个四维数据。

 我们来统计一下三个班级中数学、语文、英语三门学科男生和女生考试成绩的等级划分:

  1.  
    data = np.random.randint(10, 20, size=(6, 9)) # [10, 20)之间的随机整数
  2.  
    index = [["first", "first", "second", "second", "third", "third"],
  3.  
    ["male", "female", "male", "female", "male", "female"]]
  4.  
    columns = [["Ch", "Ch", "Ch", "Ma", "Ma", "Ma", "En", "En", "En"],
  5.  
    ["A", "B", "C", "A", "B", "C", "A", "B", "C"]]
  6.  
    df = pd.DataFrame(data, index=index, columns=columns)
  7.  
    print(df)
  8.  
    '''[out]:
  9.  
    Ch Ma En
  10.  
    A B C A B C A B C
  11.  
    first male 18 14 12 14 18 11 18 15 11
  12.  
    female 13 13 15 13 16 19 12 17 19
  13.  
    second male 11 16 17 19 19 10 15 11 13
  14.  
    female 11 11 17 16 11 17 19 12 11
  15.  
    third male 18 18 12 16 12 19 13 19 18
  16.  
    female 18 14 18 19 15 18 13 18 13'''
  17.  
    # 显示层次化索引
  18.  
    print(df.index)
  19.  
    '''[out]:
  20.  
    MultiIndex([( 'first', 'male'),
  21.  
    ( 'first', 'female'),
  22.  
    ('second', 'male'),
  23.  
    ('second', 'female'),
  24.  
    ( 'third', 'male'),
  25.  
    ( 'third', 'female')],
  26.  
    )'''
  27.  
    print(df.columns)
  28.  
    '''[out]:
  29.  
    MultiIndex([('Ch', 'A'),
  30.  
    ('Ch', 'B'),
  31.  
    ('Ch', 'C'),
  32.  
    ('Ma', 'A'),
  33.  
    ('Ma', 'B'),
  34.  
    ('Ma', 'C'),
  35.  
    ('En', 'A'),
  36.  
    ('En', 'B'),
  37.  
    ('En', 'C')],
  38.  
    )'''

 DataFrame层次化索引 应用举例

  1.  
    #各班的学生数学成绩各等级人数:
  2.  
    print(df["Ma"])
  3.  
    '''[out]:
  4.  
    A B C
  5.  
    first male 14 18 11
  6.  
    female 13 16 19
  7.  
    second male 19 19 10
  8.  
    female 16 11 17
  9.  
    third male 16 12 19
  10.  
    female 19 15 18'''
  11.  
    #获取一班的所有项:
  12.  
    print(df.loc["first"])
  13.  
    '''
  14.  
    Ch Ma En
  15.  
    A B C A B C A B C
  16.  
    male 18 14 12 14 18 11 18 15 11
  17.  
    female 13 13 15 13 16 19 12 17 19'''
  18.  
    #获取一班男女生英语成绩各等级的人数
  19.  
    print(df.loc["first", "En"])
  20.  
    ''' A B C
  21.  
    male 18 15 11
  22.  
    female 12 17 19'''
  23.  
    #获取各班语文成绩为 A 的人数:
  24.  
    print(df["Ch"]["A"])
  25.  
    '''
  26.  
    first male 18
  27.  
    female 13
  28.  
    second male 11
  29.  
    female 11
  30.  
    third male 18
  31.  
    female 18
  32.  
    Name: A, dtype: int32'''
  33.  
    #获取一班男女生的语文和英语成绩各等级人数:
  34.  
    print(df.loc["first", ["Ch", "En"]])
  35.  
    ''' Ch En
  36.  
    A B C A B C
  37.  
    male 18 14 12 18 15 11
  38.  
    female 13 13 15 12 17 19'''
  39.  
    #获取一班男女生的语文成绩 A 等级人数:
  40.  
    print(df.loc["first", "Ch"]["A"])
  41.  
    '''[out]:
  42.  
    male 18
  43.  
    female 13
  44.  
    Name: A, dtype: int32'''
  45.  
    #获取一班男生的各科成绩等级人数:
  46.  
    print(df.loc["first", :].loc["male"])
  47.  
    '''
  48.  
    Ch A 18
  49.  
    B 14
  50.  
    C 12
  51.  
    Ma A 14
  52.  
    B 18
  53.  
    C 11
  54.  
    En A 18
  55.  
    B 15
  56.  
    C 11
  57.  
    Name: male, dtype: int32'''
  58.  
     

注意:

  1.  
    import numpy as np
  2.  
    import pandas as pd
  3.  
    index=[['first','first','second','second','third','third']
  4.  
    ,['male','female','male','female','male','female']]
  5.  
    column=[['Ch','Ch','Ch','Ma','Ma','Ma','En','En','En',],
  6.  
    ['A','B','C','A','B','C','A','B','C']]
  7.  
    data=pd.DataFrame(np.random.randint(10,20,size=(6,9)),index=index,columns=column)
  8.  
    print(data.loc['second',:])
  9.  
    print(data.loc['second',:].loc['male'])
  10.  
    print('*'*50)
  11.  
    print(data.loc['second','Ma'])
  12.  
    print(data.loc['second','Ma']['A'])
  13.  
    #注意上面的两种写法->只有当指定外层的两个单个索引时,才能直接进行[]索引,否则需要继续loc

 输出:

  1.  
    ''' Ch Ma En
  2.  
    A B C A B C A B C
  3.  
    male 12 12 11 18 19 16 18 12 16
  4.  
    female 18 15 19 14 12 19 14 10 12
  5.  
    Ch A 12
  6.  
    B 12
  7.  
    C 11
  8.  
    Ma A 18
  9.  
    B 19
  10.  
    C 16
  11.  
    En A 18
  12.  
    B 12
  13.  
    C 16
  14.  
    Name: male, dtype: int32
  15.  
    **************************************************
  16.  
    A B C
  17.  
    male 18 19 16
  18.  
    female 14 12 19
  19.  
    male 18
  20.  
    female 14
  21.  
    Name: A, dtype: int32
  22.  
    '''

                                (E)数据的合并 

Pandas 包的 merge、join 方法可以完成数据的合并,merge 方法主要基于两个 DataFrame 的共同列进行合并,join 方法主要基于两个 DataFrame 的索引进行合并。

                                         (i)merge共同列

pandas.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)

学新通

  1.  
    df1 = pd.DataFrame({'key':['s','s','w','x','x','n','f','c'], 'data1':range(8)})
  2.  
    df2 = pd.DataFrame({'key':['w','w','s','s','x','f'], 'data2':range(6)})
  3.  
    '''df1:
  4.  
    key data1
  5.  
    0 s 0
  6.  
    1 s 1
  7.  
    2 w 2
  8.  
    3 x 3
  9.  
    4 x 4
  10.  
    5 n 5
  11.  
    6 f 6
  12.  
    7 c 7
  13.  
    df2:
  14.  
    key data2
  15.  
    0 w 0
  16.  
    1 w 1
  17.  
    2 s 2
  18.  
    3 s 3
  19.  
    4 x 4
  20.  
    5 f 5'''
  21.  
    #1.默认情况下的合并(默认使用的是 inner 内连接方式,结果做的交集->发现有行消失了
  22.  
    print(pd.merge(df1, df2))
  23.  
    '''
  24.  
    key data1 data2
  25.  
    0 s 0 2
  26.  
    1 s 0 3
  27.  
    2 s 1 2
  28.  
    3 s 1 3
  29.  
    4 w 2 0
  30.  
    5 w 2 1
  31.  
    6 x 3 4
  32.  
    7 x 4 4
  33.  
    8 f 6 5'''
  34.  
    #2.外连接
  35.  
    #outer 外连接方式,我们可以理解为基于共同列的并集进行连接,参数 on 设置链接的共有列名。
  36.  
    print(pd.merge(df1, df2, how="outer", on="key"))
  37.  
    ''' key data1 data2
  38.  
    0 s 0 2.0
  39.  
    1 s 0 3.0
  40.  
    2 s 1 2.0
  41.  
    3 s 1 3.0
  42.  
    4 w 2 0.0
  43.  
    5 w 2 1.0
  44.  
    6 x 3 4.0
  45.  
    7 x 4 4.0
  46.  
    8 n 5 NaN
  47.  
    9 f 6 5.0
  48.  
    10 c 7 NaN'''
  49.  
    #若两个 DataFrame 间出了 on 设置的连接列外并无相同列,则该列的值置为 NaN
  50.  
    #3.左连接
  51.  
    #left 左连接,我们可以理解为基于左边位置的 DataFrame 的列进行连接
  52.  
    print(pd.merge(df1, df2, how="left"))
  53.  
    ''' key data1 data2
  54.  
    0 s 0 2.0
  55.  
    1 s 0 3.0
  56.  
    2 s 1 2.0
  57.  
    3 s 1 3.0
  58.  
    4 w 2 0.0
  59.  
    5 w 2 1.0
  60.  
    6 x 3 4.0
  61.  
    7 x 4 4.0
  62.  
    8 n 5 NaN
  63.  
    9 f 6 5.0
  64.  
    10 c 7 NaN'''
  1.  
    4.基于多列的连接
  2.  
    df1 = pd.DataFrame({'key1': ['foo', 'foo', 'bar'],
  3.  
    'key2': ['one', 'two', 'one'],'val': [1, 2, 3]})
  4.  
    '''key1 key2 val
  5.  
    0 foo one 1
  6.  
    1 foo two 2
  7.  
    2 bar one 3'''
  8.  
    df2 = pd.DataFrame({'key1': ['foo', 'foo','bar','bar'],
  9.  
    'key2': ['one', 'one', 'one','two'],'val': [4,5,6,7]})
  10.  
    '''key1 key2 val
  11.  
    0 foo one 4
  12.  
    1 foo one 5
  13.  
    2 bar one 6
  14.  
    3 bar two 7'''
  15.  
    #4.1多列的右连接:
  16.  
    print(pd.merge(df1, df2, on=["key1", "key2"], how="right"))
  17.  
    '''key1 key2 val_x val_y
  18.  
    0 foo one 1.0 4
  19.  
    1 foo one 1.0 5
  20.  
    2 bar one 3.0 6
  21.  
    3 bar two NaN 7'''
  22.  
    #多列连接只需要传入列名组成的列表就可以了
  23.  
    #注意:left列表中foo two由于右列表无,所以,交之后被删去。右列表有的左没有,那也得加上去。
  24.  
    4.2当合并的数据有相同的列时,结构会默认在后面添加 _x, _y 来区分,
  25.  
    我们也可以通过 suffixes 参数来手动指定:
  26.  
    print(pd.merge(df1, df2, on=["key1", "key2"], suffixes=["_left", "_right"]))
  27.  
    ''' key1 key2 val_left val_right
  28.  
    0 foo one 1 4
  29.  
    1 foo one 1 5
  30.  
    2 bar one 3 6'''

                                (ii)Join:更为方便的实现行索引上的合并

DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)

学新通

  1.  
    df1 = pd.DataFrame(np.arange(8).reshape(2, 4),
  2.  
    index=["one", "two"], columns=list("ABCD"))
  3.  
    ''' A B C D
  4.  
    one 0 1 2 3
  5.  
    two 4 5 6 7'''
  6.  
    df2 = pd.DataFrame(np.arange(12).reshape(3, 4),
  7.  
    index=["one", "two", "three"], columns=list("CDEF"))
  8.  
    ''' W X Y Z
  9.  
    one 0 1 2 3
  10.  
    two 4 5 6 7
  11.  
    three 8 9 10 11'''
  12.  
    #1.默认情况下的join
  13.  
    # 未指定合并的列,默认选取两者重复的列
  14.  
    print(df1.join(df2))
  15.  
    ''' A B C D W X Y Z
  16.  
    one 0 1 2 3 0 1 2 3
  17.  
    two 4 5 6 7 4 5 6 7'''
  18.  
    #2.df2.join(df1)
  19.  
    df2.join(df1)
  20.  
    ''' W X Y Z A B C D
  21.  
    one 0 1 2 3 0.0 1.0 2.0 3.0
  22.  
    two 4 5 6 7 4.0 5.0 6.0 7.0
  23.  
    three 8 9 10 11 NaN NaN NaN NaN'''
  24.  
    #可见会以前者的索引为基准来进行合并,并且不足的地方会自动填充 NaN 值,超出的地方会自动删除

                                (F)分割与组合

学新通

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=<no_default>, observed=False, dropna=True)

参数说明:

  • by:接收list,string,mapping,generator,用于确定分组的依据,无默认。
  • axis:接收int,表示操作的轴向,默认为0,对列进行操作。
  • level:接收int或者索引名,代表标签所在级别。
  • as_index:表示聚合后的聚合标签是否以DataFrame索引形式输出,默认为True
  • sort:表示是否对分组依据分组标签进行排序。
  • group_keys:表示是否显示分组标签的名称。
  • squeeze:表示是否在允许的情况下对返回数据进行降维。

更加详细的 API 描述可以查阅官方文档 pandas.DataFrame.groupby

我们先来创建一个 DataFrame,包含课程,等级,和男女生人数信息:

  1.  
    # 用字典创建DataFrame
  2.  
    [in]: data = {"lessons": ['Ch', 'En', 'Ch', 'En', 'Ch', 'Ma', 'En', 'Ma'],
  3.  
    "grade": ['A', 'A', 'B', 'B', 'C', 'A', 'C', 'B'],
  4.  
    "male": np.random.randint(10, 20, 8), # [10, 20)的8个随机整数
  5.  
    "female": np.random.randint(10, 20, 8)}
  6.  
    [in]: df = pd.DataFrame(data)
  7.  
    [in]: print(df)
  8.  
    [out]:
  9.  
    lessons grade male female
  10.  
    0 Ch A 14 17
  11.  
    1 En A 10 11
  12.  
    2 Ch B 11 11
  13.  
    3 En B 15 12
  14.  
    4 Ch C 14 13
  15.  
    5 Ma A 15 19
  16.  
    6 En C 19 15
  17.  
    7 Ma B 17 12

对课程 lessons 分组,我们会得到什么呢

  1.  
    [in]: print(df.groupby(by="lessons"))
  2.  
    [out]:
  3.  
    <pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000209C7C76460>

我们看到它实际上还没有进行任何计算,而是返回了一个 DataFrameGroupBy 对象用 groupby 方法分组后的结果并不能直接查看,而是被存在内存中,输出的时内存地址。

如果要得到我们想要的结果,我们应该怎么做呢? DataFrameGroupBy 对象有很多经过优化的方法:

  • count:计算分组中非NA值的数量
  • sum:计算非NA值的和
  • mean:计算非NA值的平均值
  • median:计算非NA值的算术中位数
  • std、var:无偏(分母为n-1)标准差和方差
  • min、max:非NA值的最小值和最大值

我们来尝试计算一下各等级的男生人数

  1.  
    [in]: group1 = df.groupby(by="grade")
  2.  
    [in]: print(group1.sum())
  3.  
    [out]:
  4.  
    male female
  5.  
    grade
  6.  
    A 39 47
  7.  
    B 43 35
  8.  
    C 33 28

size() 返回每个分组的元素个数

  1.  
    [in]: group2 = df.groupby(by="lessons")
  2.  
    [in]: print(group2.count())
  3.  
    [in]: print('-' * 50)
  4.  
    [in]: print(group2.size())
  5.  
    [out]:
  6.  
    grade male female
  7.  
    lessons
  8.  
    Ch 3 3 3
  9.  
    En 3 3 3
  10.  
    Ma 2 2 2
  11.  
    --------------------------------------------------
  12.  
    lessons
  13.  
    Ch 3
  14.  
    En 3
  15.  
    Ma 2
  16.  
    dtype: int64

一次传入多个分组依据,统计各学科各等级的男女生人数

  1.  
    # 安装学科和成绩进行分组
  2.  
    [in]: group3 = df.groupby(by=[df["lessons"], df["grade"]])
  3.  
    [in]: print(group3.sum())
  4.  
    [out]:
  5.  
    male female
  6.  
    lessons grade
  7.  
    Ch A 14 17
  8.  
    B 11 11
  9.  
    C 14 13
  10.  
    En A 10 11
  11.  
    B 15 12
  12.  
    C 19 15
  13.  
    Ma A 15 19
  14.  
    B 17 12

我们在分组统计之后如果只想查看男生的情况,当然也是可以的

  1.  
    [in]: print(df.groupby(by=[df["lessons"], df["grade"]]).sum()["male"])
  2.  
    [out]:
  3.  
    lessons grade
  4.  
    Ch A 14
  5.  
    B 11
  6.  
    C 14
  7.  
    En A 10
  8.  
    B 15
  9.  
    C 19
  10.  
    Ma A 15
  11.  
    B 17
  12.  
    Name: male, dtype: int32

这样的写法 df["male"].groupby(by=[df["lessons"], df["grade"]]).sum() 当然也是可以的。

        2.读写数据

                ①read_csv   学新通

data = pd.read_csv("train.csv")

                ②read_table学新通

                ③ to_csv学新通

        3.缺失值数据处理

  1.  
    [in]: df = pd.DataFrame(np.random.randn(4, 5), index=["one", "two", "three", "four"], columns=list("ABCDE"))
  2.  
    [in]: df.iloc[0, 2] = np.nan
  3.  
    [in]: df.iloc[[1, 3], 4] = np.nan #锁定五列,将二四行置NaN
  4.  
    [in]: print(df)
  5.  
    [out]:
  6.  
    A B C D E
  7.  
    one 0.123806 0.493575 NaN 0.476856 0.547563
  8.  
    two 0.750184 -0.326554 0.448464 0.449652 NaN
  9.  
    three 1.075840 0.228632 0.769619 -1.091077 0.440128
  10.  
    four -1.545927 0.243639 1.158786 1.381231 NaN

学新通

学新通

注:df.mean()是获取每列的均质构成5*1的ndaray学新通

        4. 数据特征分析

                ①排序

                        sort_index方法

    .sort_index() 方法在指定轴上根据索引进行排序,默认为零轴,升序。

.sort_index(axis=0,ascending=True)
  • axis: 指定要排序的轴。
  • ascending : 指递增排序。
  1.  
    [in]: df1 = pd.DataFrame(np.arange(20).reshape(4,5), index = list("cabd"))
  2.  
    [in]: print(df1)
  3.  
    [in]: print('-' * 50)
  4.  
    [out]:
  5.  
    0 1 2 3 4
  6.  
    c 0 1 2 3 4
  7.  
    a 5 6 7 8 9
  8.  
    b 10 11 12 13 14
  9.  
    d 15 16 17 18 19
  10.  
    --------------------------------------------------
  11.  
    # 规定按照降序排序
  12.  
    [in]: print(df1.sort_index(ascending=False))
  13.  
    [out]:
  14.  
    0 1 2 3 4
  15.  
    d 15 16 17 18 19
  16.  
    c 0 1 2 3 4
  17.  
    b 10 11 12 13 14
  18.  
    a 5 6 7 8 9

                                  sort_values 方法

    .sort_values() 方法在指定轴上根据数值进行排序,默认为零轴,升序

  1.  
    Series.sort_values(axis=0, ascending=True)
  2.  
    DataFrame.sort_values(by, axis=0, ascending=True)
  • by: axis 轴上的某个索引或索引列表。
  • ascending : 指递增排序。
  1.  
    [in]: df2 = pd.DataFrame(np.arange(20).reshape(4,5), index = list("abcd"))
  2.  
    [in]: print(df2)
  3.  
    [out]:
  4.  
    0 1 2 3 4
  5.  
    a 0 1 2 3 4
  6.  
    b 5 6 7 8 9
  7.  
    c 10 11 12 13 14
  8.  
    d 15 16 17 18 19
  9.  
    # 默认在0轴上,指定对索引为2的那一列按照降序排序
  10.  
    [in]: print(b.sort_values(2, ascending=False))
  11.  
    [out]:
  12.  
    0 1 2 3 4
  13.  
    d 15 16 17 18 19
  14.  
    c 10 11 12 13 14
  15.  
    b 5 6 7 8 9
  16.  
    a 0 1 2 3 4
  17.  
    # 指定在1轴上,对索引为‘c’的那一行进行降序排序
  18.  
    [in]: print(b.sort_values('a',axis=1, ascending=False))
  19.  
    [out]:
  20.  
    4 3 2 1 0
  21.  
    a 4 3 2 1 0
  22.  
    b 9 8 7 6 5
  23.  
    c 14 13 12 11 10
  24.  
    d 19 18 17 16 15

                        ②.基本统计数据

适用于 Series 和 DataFrame 类型:

方法 说明
.sum() 计算数据的总和,按0轴计算,下同
.count() 非Nan值的数量
.mean() .median() 计算数据的算数平均值、算数中位数
.var() .std() 计算数据的方差、标准差
.min() .max() 计算数据的最小值、最大值

适用于 Series 类型的方法:

方法 说明
.argmin() .argmax() 计算数据最大值、最小值所在位置的索引(返回自动索引)
.idxmin() .idxmax() 计算数据最大值、最小值所在位置的索引(返回自定义索引)

适用于 Series 和 DataFrame 类型:

方法 说明
.describe() 针对0轴(各列)的统计汇总

统计 df1 在行方向的均值和列方向的均值

  1.  
    # 在0轴上的均值
  2.  
    [in]: print(df1.mean(axis=0))
  3.  
    [out]:
  4.  
    0 7.5
  5.  
    1 8.5
  6.  
    2 9.5
  7.  
    3 10.5
  8.  
    4 11.5
  9.  
    dtype: float64
  10.  
    # 在1轴上的均值
  11.  
    [in]: print(df1.mean(axis=1))
  12.  
    [out]:
  13.  
    c 2.0
  14.  
    a 7.0
  15.  
    b 12.0
  16.  
    d 17.0
  17.  
    dtype: float64

                                ③.累计统计数据

适用于 Series 和 DataFrame 类型:

方法 说明
.cumsum() 依次给出前1、2、…、n个数的和
.cumprod() 依次给出前1、2、…、n个数的积
.cummax() 依次给出前1、2、…、n个数的最大值
.cummin() 依次给出前1、2、…、n个数的最小值
  1.  
    [in]: a = pd.DataFrame(np.arange(20).reshape(4,5), index = list("abcd"))
  2.  
    [in]: print(a)
  3.  
    [in]: print("-" * 50)
  4.  
    [out]:
  5.  
    0 1 2 3 4
  6.  
    a 0 1 2 3 4
  7.  
    b 5 6 7 8 9
  8.  
    c 10 11 12 13 14
  9.  
    d 15 16 17 18 19
  10.  
    --------------------------------------------------
  11.  
    [in]: print(a.cumsum())
  12.  
    [in]: print("-" * 50)
  13.  
    [out]:
  14.  
    0 1 2 3 4
  15.  
    a 0 1 2 3 4
  16.  
    b 5 7 9 11 13
  17.  
    c 15 18 21 24 27
  18.  
    d 30 34 38 42 46
  19.  
    --------------------------------------------------
  20.  
    [in]: print(a.cumprod())
  21.  
    [in]: print("-" * 50)
  22.  
    [out]:
  23.  
    0 1 2 3 4
  24.  
    a 0 1 2 3 4
  25.  
    b 0 6 14 24 36
  26.  
    c 0 66 168 312 504
  27.  
    d 0 1056 2856 5616 9576
  28.  
    --------------------------------------------------
  29.  
    [in]: print(a.cummax())
  30.  
    [in]: print("-" * 50)
  31.  
    [out]:
  32.  
    0 1 2 3 4
  33.  
    a 0 1 2 3 4
  34.  
    b 5 6 7 8 9
  35.  
    c 10 11 12 13 14
  36.  
    d 15 16 17 18 19
  37.  
    --------------------------------------------------
  38.  
    [in]: print(a.cummin())
  39.  
    [out]:
  40.  
    0 1 2 3 4
  41.  
    a 0 1 2 3 4
  42.  
    b 0 1 2 3 4
  43.  
    c 0 1 2 3 4
  44.  
    d 0 1 2 3 4

适用于 Series 和 DataFrame 类型,滚动计算(窗口计算)

方法 说明
.rolling(w).sum() 依次计算相邻w个元素的和
.rolling(w).mean() 依次计算相邻w个元素的算数平均值
.rolling(w).var() 依次计算相邻w个元素的方差
.rolling(w).std() 依次计算相邻w个元素的标准差
.rolling(w).min() .max() 依次计算相邻w个元素的最小值和最大值
  1.  
    [in]: b = pd.DataFrame(np.arange(20).reshape(4,5), index = list("abcd"))
  2.  
    [in]: print(b)
  3.  
    [in]: print("-" * 50)
  4.  
    [out]:
  5.  
    0 1 2 3 4
  6.  
    a 0 1 2 3 4
  7.  
    b 5 6 7 8 9
  8.  
    c 10 11 12 13 14
  9.  
    d 15 16 17 18 19
  10.  
    --------------------------------------------------
  11.  
    # 每一行元素都和他的上一行元素相加。第一行的上一行为NaN,相加还为NaN
  12.  
    [in]: print(b.rolling(2).sum())
  13.  
    [in]: print("-" * 50)
  14.  
    [out]:
  15.  
    0 1 2 3 4
  16.  
    a NaN NaN NaN NaN NaN
  17.  
    b 5.0 7.0 9.0 11.0 13.0
  18.  
    c 15.0 17.0 19.0 21.0 23.0
  19.  
    d 25.0 27.0 29.0 31.0 33.0
  20.  
    --------------------------------------------------
  21.  
    [in]: print(b.rolling(3).sum())
  22.  
    [in]: print("-" * 50)
  23.  
    [out]:
  24.  
    0 1 2 3 4
  25.  
    a NaN NaN NaN NaN NaN
  26.  
    b NaN NaN NaN NaN NaN
  27.  
    c 15.0 18.0 21.0 24.0 27.0
  28.  
    d 30.0 33.0 36.0 39.0 42.0

                        ④.相关性分析

   什么是相关性呢,现有两个事物,表示为X和Y:

  • X增大,Y增大,两个变量正相关
  • X增大,Y减小,两个变量负相关
  • X增大,Y无视,两个变量不变

在统计学上的度量标准为:协方差

学新通

  • 协方差>0, X和Y正相关
  • 协方差<0, X和Y负相关
  • 协方差=0, X和Y独立

相关分析函数

适用于 Series 和 DataFrame

方法 说明
.cov() 计算协方差矩阵
.corr() 计算相关系数矩阵,Pearson、Spearman、Kendall等系数

我们来看一下效果 

  1.  
    [in]: df = pd.DataFrame(np.random.randn(3,4))
  2.  
    [in]: print(df)
  3.  
    [in]: print("-" * 50)
  4.  
    [in]: print(df.cov())
  5.  
    [in]: print("-" * 50)
  6.  
    [in]: print(df.corr())
  7.  
    [out]:
  8.  
    0 1 2 3
  9.  
    0 0.040277 -0.301868 0.001866 0.266581
  10.  
    1 -0.299964 -0.505190 0.142053 -0.298927
  11.  
    2 0.641009 1.433105 1.230602 0.466891
  12.  
    --------------------------------------------------
  13.  
    0 1 2 3
  14.  
    0 0.227012 0.489220 0.285790 0.172226
  15.  
    1 0.489220 1.134743 0.702208 0.324482
  16.  
    2 0.285790 0.702208 0.452397 0.166747
  17.  
    3 0.172226 0.324482 0.166747 0.157733
  18.  
    --------------------------------------------------
  19.  
    0 1 2 3
  20.  
    0 1.000000 0.963896 0.891789 0.910148
  21.  
    1 0.963896 1.000000 0.980070 0.766974
  22.  
    2 0.891789 0.980070 1.000000 0.624218
  23.  
    3 0.910148 0.766974 0.624218 1.000000

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhjgjka
系列文章
更多 icon
同类精品
更多 icon
继续加载