• 学习 Python 之 Pandas库


    Pandas库

    什么是Pandas库?

    Pandas是基于Numpy的专业数据分析工具, 可以灵活高效的处理各种数据集

    它提供了的数据结构有DataFrame和Series等

    我们可以简单粗的把DataFrame理解为Excel里面的一张表,而Series就是表中的某一列

    DataFrame 创建和存储

    函数

    函数作用
    DataFrame(data = 数据, index = 行标题, columns = 列标题, dtype = 类型, copy = 是否深拷贝)创建DataFrame对象
    read_csv(filepath_or_buffer = 文件路径, delimiter = 分隔符, header = 是否第一行为列标题, engine = 引擎, encoding = 编码)读取.csv文件创建DataFrame对象
    read_excel(路径, header = 指定哪一行为标题, names = 指定列标题)读取.xlsx文件创建DataFrame对象
    .to_csv(路径)保存为.csv文件
    .to_excel(路径)保存为.xlsx文件

    1. 使用DataFrame构造函数

    函数作用
    DataFrame(data = 数据, index = 行标题, columns = 列标题, dtype = 类型, copy = 是否深拷贝)创建DataFrame对象

    创建时不指定index,系统会自动生成从0开始的索引, 即行标题从0开始

    (1). 使用列表创建

    import pandas
    
    dataFrame = pandas.DataFrame(
        data = [
            [60, 78, 92, 85],
            [70, 68, 95, 76],
            [88, 98, 83, 87]
        ],
        index = ['小明', '小红', '小强',],
        columns=['语文', '数学', '英语', '化学'],
        dtype = float,
        copy = True
    )
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果:

          语文    数学    英语    化学
    小明  60.0  78.0  92.0  85.0
    小红  70.0  68.0  95.0  76.0
    小强  88.0  98.0  83.0  87.0
    
    • 1
    • 2
    • 3
    • 4

    使用列表创建

    一个列表表示一条记录

    index是每一条记录的名称

    columns是每一列的名字

    (2). 使用字典创建

    import pandas
    
    dataFrame = pandas.DataFrame(
        data = {
            '语文': [60, 78, 92, 85],
            '数学': [70, 68, 95, 76],
            '英语': [88, 98, 83, 87],
        },
        index = ['小明', '小红', '小强', '小美'],
        dtype = float,
        copy = True
    )
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结果:

          语文    数学    英语
    小明  60.0  70.0  88.0
    小红  78.0  68.0  98.0
    小强  92.0  95.0  83.0
    小美  85.0  76.0  87.0
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用字典创建

    列名称是字典中键的名称, 字典中的元素是该列的值

    index是每一条记录的名称, index的长度与字典中某一个键值对的值的长度一样

    (3). 从另一个DataFrame对象创建

    import pandas
    
    dataFrame = pandas.DataFrame(
        data = [
            [60, 78, 92, 85],
            [70, 68, 95, 76],
            [88, 98, 83, 87]
        ],
        index = ['小明', '小红', '小强', ],
        columns = ['语文', '数学', '英语', '化学'],
        dtype = float,
        copy = False
    )
    dataFrame2 = pandas.DataFrame(dataFrame, copy = False)
    print(dataFrame2)
    dataFrame2['语文'] = [0, 0, 0]
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    结果:

          语文    数学    英语    化学
    小明  60.0  78.0  92.0  85.0
    小红  70.0  68.0  95.0  76.0
    小强  88.0  98.0  83.0  87.0
        语文    数学    英语    化学
    小明   0  78.0  92.0  85.0
    小红   0  68.0  95.0  76.0
    小强   0  98.0  83.0  87.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    从已有的DataFrame创建, copy参数可以指定深拷贝还是浅拷贝

    当copy = False是浅拷贝, 上面的这个例子就证明了

    2. 从文件读取

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WPjNMdzf-1654143923432)(Pandas图片/img_1.png)]

    函数作用
    read_csv(filepath_or_buffer = 文件路径, delimiter = 分隔符, header = 是否第一行为列标题, engine = 引擎, encoding = 编码)读取.csv文件创建DataFrame对象
    read_excel(路径, header = 指定哪一行为标题, names = 指定列标题)读取.xlsx文件创建DataFrame对象

    (1). 从.csv文件读取

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbWIevrU-1654143923434)(Pandas图片/img_2.png)]

    import pandas
    
    dataFrame = pandas.read_csv('../数据/test.csv')
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4

    结果:

       姓名    语文    数学     英语
    0  小明  62.0  66.0   86.0
    1  小红  86.0  97.5  100.0
    
    • 1
    • 2
    • 3

    默认分隔符以","逗号分割, 可以指定分割类型

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-djldd8ju-1654143923435)(Pandas图片/img_3.png)]

    import pandas
    
    dataFrame = pandas.read_csv(
        '../数据/test.csv',
        delimiter = '|'
    )
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    结果:

       姓名    语文    数学     英语
    0  小明  62.0  66.0   86.0
    1  小红  86.0  97.5  100.0
    
    • 1
    • 2
    • 3

    默认以第一行作为列标题, 可以不知道列标题, 这样第一行也变成了数据

    import pandas
    
    dataFrame = pandas.read_csv(
        filepath_or_buffer = '../数据/test.csv',
        delimiter = '|',
        header = None,
        engine = 'python',
        encoding = 'utf-8'
    )
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结果:

        0    1     2     3
    0  姓名   语文    数学    英语
    1  小明  62.   66.   86.
    2  小红  86.  97.5  100.
    
    • 1
    • 2
    • 3
    • 4

    engine是使用的分析引擎,读取csv文件一般指定python避免中文和编码造成的报错

    encoding是编码格式

    (2). 从excel文件读取

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M48iNtPG-1654143923436)(Pandas图片/img.png)]

    import pandas
    
    dataFrame = pandas.read_excel(
        '../数据/test.XLSX',
        header = None
    )
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
        0     1     2
    0  姓名    语文    数学
    1  小明  66.5    86
    2  小红    89  99.5
    
    • 1
    • 2
    • 3
    • 4

    3. 存储

    函数作用
    .to_csv(路径)保存为.csv文件
    .to_excel(路径)保存为.xlsx文件

    DataFrame 查看数据

    函数

    函数作用
    .head(n = 5)查看数据前n行
    .tail(n = 5)查看数据后n行
    .info()查看数据信息
    .describe()查看数据统计信息

    1. 查看前几行

    import pandas
    from sklearn import datasets
    
    iris = datasets.load_iris()
    dataFrame = pandas.DataFrame(iris.data)
    print(dataFrame.head(10))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果:

         0    1    2    3
    0  5.1  3.5  1.4  0.2
    1  4.9  3.0  1.4  0.2
    2  4.7  3.2  1.3  0.2
    3  4.6  3.1  1.5  0.2
    4  5.0  3.6  1.4  0.2
    5  5.4  3.9  1.7  0.4
    6  4.6  3.4  1.4  0.3
    7  5.0  3.4  1.5  0.2
    8  4.4  2.9  1.4  0.2
    9  4.9  3.1  1.5  0.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2. 查看后几行

    import pandas
    from sklearn import datasets
    
    iris = datasets.load_iris()
    dataFrame = pandas.DataFrame(iris.data)
    print(dataFrame.tail())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果:

           0    1    2    3
    145  6.7  3.0  5.2  2.3
    146  6.3  2.5  5.0  1.9
    147  6.5  3.0  5.2  2.0
    148  6.2  3.4  5.4  2.3
    149  5.9  3.0  5.1  1.8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3. 格式查看

    import pandas
    from sklearn import datasets
    
    iris = datasets.load_iris()
    dataFrame = pandas.DataFrame(iris.data)
    print(dataFrame.info())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果:

    # 对象的类型
    <class 'pandas.core.frame.DataFrame'>
    # 数据范围, 一共150个, 从0 - 149
    RangeIndex: 150 entries, 0 to 149
    # 数据一共4列
    Data columns (total 4 columns):
     #   Column  Non-Null Count  Dtype  
    ---  ------  --------------  -----  
     0   0       150 non-null    float64
     1   1       150 non-null    float64
     2   2       150 non-null    float64
     3   3       150 non-null    float64
    dtypes: float64(4)
    memory usage: 4.8 KB
    None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4. 查看统计信息

    import pandas
    from sklearn import datasets
    
    iris = datasets.load_iris()
    dataFrame = pandas.DataFrame(iris.data)
    print(dataFrame.describe())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果:

                    0           1           2           3
    count  150.000000  150.000000  150.000000  150.000000
    mean     5.843333    3.057333    3.758000    1.199333
    std      0.828066    0.435866    1.765298    0.762238
    min      4.300000    2.000000    1.000000    0.100000
    25%      5.100000    2.800000    1.600000    0.300000
    50%      5.800000    3.000000    4.350000    1.300000
    75%      6.400000    3.300000    5.100000    1.800000
    max      7.900000    4.400000    6.900000    2.500000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    DataFrame 列操作

    函数

    函数作用
    .drop(列名, axis = 1, inplace = True)查看数据前n行

    1. 增加列

    增加一列,用dataFrame[‘新列名’] = 新列值的形式, 在原数据基础上赋值即可

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            [60, 78, 92, 85],
            [70, 68, 95, 76],
            [88, 98, 83, 87]
        ],
        index = ['小明', '小红', '小强', ],
        columns = ['语文', '数学', '英语', '化学'],
        dtype = float
    )
    print(dataFrame)
    dataFrame['生物'] = [96, 86, 88]
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    结果:

          语文    数学    英语    化学
    小明  60.0  78.0  92.0  85.0
    小红  70.0  68.0  95.0  76.0
    小强  88.0  98.0  83.0  87.0
          语文    数学    英语    化学  生物
    小明  60.0  78.0  92.0  85.0  96
    小红  70.0  68.0  95.0  76.0  86
    小强  88.0  98.0  83.0  87.0  88
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    将其他的数据列增加过来, 即横向合并

    import pandas
    
    dataFrame1 = pandas.DataFrame(
        data=[
            ['一级', '读书', 21, 176],
            ['二级', '游泳', 22, 178],
            ['三级', '游泳', 21, 185],
            ['二级', '游泳', 19, 182],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index = ['小明', '小红', '小强', '小于']
    )
    print(dataFrame1)
    dataFrame2 = pandas.DataFrame(
        data=[
            ['学士', 'O'],
            ['学士', 'A'],
            ['博士', 'A'],
            ['院士', 'B'],
        ],
        columns=['学位', '血型'],
        index = ['小明', '小红', '小强', '小于']
    )
    print(dataFrame2)
    r = pandas.merge(
        left = dataFrame1,
        right = dataFrame2,
        left_index = True,
        right_index = True,
        how = 'inner'
    )
    print(r)
    
    • 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

    结果:

        等级  爱好  年龄   身高
    小明  一级  读书  21  176
    小红  二级  游泳  22  178
    小强  三级  游泳  21  185
    小于  二级  游泳  19  182
        学位 血型
    小明  学士  O
    小红  学士  A
    小强  博士  A
    小于  院士  B
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2. 删除列

    使用, axis = 0表示对行操作, axis = 1表示针对列的操作, inplace为True, 则直接在源数据上进行修改, 否则源数据会保持原样

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            [60, 78, 92, 85],
            [70, 68, 95, 76],
            [88, 98, 83, 87]
        ],
        index = ['小明', '小红', '小强', ],
        columns = ['语文', '数学', '英语', '化学'],
        dtype = float
    )
    dataFrame['生物'] = [96, 86, 88]
    print(dataFrame)
    dataFrame.drop('化学', axis = 1, inplace = True)
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    结果:

          语文    数学    英语    化学  生物
    小明  60.0  78.0  92.0  85.0  96
    小红  70.0  68.0  95.0  76.0  86
    小强  88.0  98.0  83.0  87.0  88
          语文    数学    英语  生物
    小明  60.0  78.0  92.0  96
    小红  70.0  68.0  95.0  86
    小强  88.0  98.0  83.0  88
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3. 选择列

    import pandas
    dataFrame = pandas.DataFrame(
        data=[
            [60, 78, 92, 85],
            [70, 68, 95, 76],
            [88, 98, 83, 87]
        ],
        index=['小明', '小红', '小强', ],
        columns=['语文', '数学', '英语', '化学'],
        dtype=float
    )
    print(dataFrame['语文'])
    print(dataFrame[['语文', '化学']])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结果:

    小明    60.0
    小红    70.0
    小强    88.0
    Name: 语文, dtype: float64
          语文    化学
    小明  60.0  85.0
    小红  70.0  76.0
    小强  88.0  87.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4. 修改列

    全部修改为同一个值

    指定修改的列的内容

    import pandas
    dataFrame = pandas.DataFrame(
        data=[
            [60, 78, 92, 85],
            [70, 68, 95, 76],
            [88, 98, 83, 87]
        ],
        index=['小明', '小红', '小强', ],
        columns=['语文', '数学', '英语', '化学'],
        dtype=float
    )
    dataFrame['语文'] = 1
    dataFrame['化学'] = [100, 100, 100.0]
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果:

        语文    数学    英语     化学
    小明   1  78.0  92.0  100.0
    小红   1  68.0  95.0  100.0
    小强   1  98.0  83.0  100.0
    
    • 1
    • 2
    • 3
    • 4

    DataFrame 索引

    属性作用
    iloc[ , ]对数据操作, 允许整数, 整数的列表, 切片, 布尔数组
    loc[ , ]对数据操作, 允许标签和布尔
    isin(数据列表)处于数据列表

    1. 数字索引

    dataFrame[行索引, 列索引]

    取出数据中 3×3的零

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            [60, 78, 92, 85],
            [70, 68, 95, 76],
            [88, 98, 83, 87],
            [60, 78, 92, 85],
            [70, 0, 0, 0],
            [88, 0, 0, 0],
            [60, 0, 0, 0],
            [70, 68, 95, 76],
            [88, 98, 83, 87]
        ],
        dtype = float,
        columns = ['语文', '数学', '英语', '化学']
    )
    a = dataFrame.iloc[4:7, 1:]
    print(a)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    结果:

        数学   英语   化学
    4  0.0  0.0  0.0
    5  0.0  0.0  0.0
    6  0.0  0.0  0.0
    
    • 1
    • 2
    • 3
    • 4

    取出数据中 2×2的零

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            [60, 78, 92, 85],
            [70, 68, 95, 76],
            [88, 98, 83, 87],
            [60, 78, 92, 85],
            [70, 0, 92, 0],
            [60, 78, 92, 85],
            [60, 0, 92, 0],
            [70, 68, 95, 76],
            [88, 98, 83, 87]
        ],
        dtype = float,
        columns = ['语文', '数学', '英语', '化学']
    )
    a = dataFrame.iloc[4:7:2, 1:4:2]
    print(a)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    结果:

        数学   化学
    4  0.0  0.0
    6  0.0  0.0
    
    • 1
    • 2
    • 3

    2. 布尔索引

    dataFrame[行索引, 列索引]

    行索引和列索引可以是布尔数组

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', '读书', 21, 176],
            ['二级', '游泳', 22, 178],
            ['三级', '游泳', 21, 185],
            ['二级', '游泳', 19, 182],
        ],
        columns = ['等级', '爱好', '年龄', '身高']
    )
    b = [True, False, False, True]
    a = dataFrame.iloc[b, :]
    print(a)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果:

       等级  爱好  年龄   身高
    0  一级  读书  21  176
    3  二级  游泳  19  182
    
    • 1
    • 2
    • 3

    iloc()函数参数允许:

    1. 整数
    2. 整数的列表
    3. 切片
    4. 布尔数组

    3. 标签索引

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', '读书', 21, 176],
            ['二级', '游泳', 22, 178],
            ['三级', '游泳', 21, 185],
            ['二级', '游泳', 19, 182],
        ],
        columns=['等级', '爱好', '年龄', '身高']
    )
    # 找出等级为一的全部数据
    b = (dataFrame['等级'] == '一级') & (dataFrame['年龄'] == 21)
    r = dataFrame.loc[b, :]
    print(r)
    r = dataFrame.loc[:, ['年龄']]
    print(r)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    结果:

       等级  爱好  年龄   身高
    0  一级  读书  21  176
       年龄
    0  21
    1  22
    2  21
    3  19
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    找出等级在是二和三的数据

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', '读书', 21, 176],
            ['二级', '游泳', 22, 178],
            ['三级', '游泳', 21, 185],
            ['二级', '游泳', 19, 182],
        ],
        columns=['等级', '爱好', '年龄', '身高']
    )
    b = dataFrame['等级'].isin(['二级', '三级'])
    r = dataFrame.loc[b, :]
    print(r)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果:

       等级  爱好  年龄   身高
    1  二级  游泳  22  178
    2  三级  游泳  21  185
    3  二级  游泳  19  182
    
    • 1
    • 2
    • 3
    • 4

    DataFrame 操作

    函数作用
    concat(dataFrame列表)将这些dataFrame的数据纵向叠加
    merge(left = 左表, right = 右表, left_index, right_index, how = 连接方式)按照指定连接方式将两个表合并
    .dropna(subset = 列名列表)只要一行中任意一个字段为空,就会被删除
    .isnull()返回布尔DataFrame对象
    .fillna(值)用值填充空值
    .dropduplicates(subset = 列名列表, keep = 'first' 或 'last')删除完全重复行, 可指定某字段重复时删除, 默认保留第一个, 后面重复的会删掉
    .sort_values(by = 列名, ascending = 是否升序)对指定列排序
    .groupby('列名')对指定列分组, 就是把该列值一样的分成一组
    cut(x = 切分数据, bins = 切分方式, right = 是否包含右区间, labels = 分割后每段的名字列表)对一个数组进行分段
    inplace属性 True : 对原来数据操作, False : 不对原来的数据操作

    1. 纵向合并

    import pandas
    
    dataFrame1 = pandas.DataFrame(
        data=[
            ['一级', '读书', 21, 176],
            ['二级', '游泳', 22, 178],
            ['三级', '游泳', 21, 185],
            ['二级', '游泳', 19, 182],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index = ['小明', '小红', '小强', '小于']
    )
    r = pandas.concat([dataFrame1, dataFrame1])
    print(r)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果:

        等级  爱好  年龄   身高
    小明  一级  读书  21  176
    小红  二级  游泳  22  178
    小强  三级  游泳  21  185
    小于  二级  游泳  19  182
    小明  一级  读书  21  176
    小红  二级  游泳  22  178
    小强  三级  游泳  21  185
    小于  二级  游泳  19  182
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2. 横向合并

    import pandas
    
    dataFrame1 = pandas.DataFrame(
        data=[
            ['一级', '读书', 21, 176],
            ['二级', '游泳', 22, 178],
            ['三级', '游泳', 21, 185],
            ['二级', '游泳', 19, 182],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index=['小明', '小红', '小强', '小于']
    )
    print(dataFrame1)
    dataFrame2 = pandas.DataFrame(
        data=[
            ['学士', 'O'],
            ['学士', 'A'],
            ['博士', 'A'],
            ['院士', 'B'],
        ],
        columns=['学位', '血型'],
        index=['小明', '小红', '小强', '小于']
    )
    print(dataFrame2)
    r = pandas.merge(
        left=dataFrame1,
        right=dataFrame2,
        left_index=True,
        right_index=True,
        how='inner'
    )
    print(r)
    
    • 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

    结果:

        等级  爱好  年龄   身高
    小明  一级  读书  21  176
    小红  二级  游泳  22  178
    小强  三级  游泳  21  185
    小于  二级  游泳  19  182
    小明  一级  读书  21  176
    小红  二级  游泳  22  178
    小强  三级  游泳  21  185
    小于  二级  游泳  19  182
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    参数作用
    left左表名
    right右表名
    left_index左表按照索引连接
    right_index右表按照索引连接
    how连接方式, inner, left, right, outer

    左连接左表数据不改变, 连接时没有的字段为空

    右连接右表数据不改变, 连接时没有的字段为空

    外连接是两个表的数据都不变, 没有的字段为空

    3. 空值处理

    函数作用
    .dropna(subset = 列名列表)只要一行中任意一个字段为空,就会被删除
    .isnull()返回布尔DataFrame对象

    (1). 判断空值

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', None, 21, 176],
            ['二级', '游泳', None, 178],
            ['三级', '游泳', 21, 185],
            [None, '游泳', 19, None],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index=['小明', '小红', '小强', '小于']
    )
    print(dataFrame)
    print(dataFrame.isnull())
    print(dataFrame['等级'].isnull())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    结果:

          等级    爱好    年龄     身高
    小明    一级  None  21.0  176.0
    小红    二级    游泳   NaN  178.0
    小强    三级    游泳  21.0  185.0
    小于  None    游泳  19.0    NaN
           等级     爱好     年龄     身高
    小明  False   True  False  False
    小红  False  False   True  False
    小强  False  False  False  False
    小于   True  False  False   True
    小明    False
    小红    False
    小强    False
    小于     True
    Name: 等级, dtype: bool
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    (2). 计算空值个数

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', None, 21, 176],
            ['二级', '游泳', None, 178],
            ['三级', '游泳', 21, 185],
            [None, '游泳', 19, None],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index=['小明', '小红', '小强', '小于']
    )
    print(dataFrame)
    print(dataFrame.isnull().sum())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果:

          等级    爱好    年龄     身高
    小明    一级  None  21.0  176.0
    小红    二级    游泳   NaN  178.0
    小强    三级    游泳  21.0  185.0
    小于  None    游泳  19.0    NaN
    等级    1
    爱好    1
    年龄    1
    身高    1
    dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (3). 删除空值

    dropna()函数, 只要一行中任意一个字段为空,就会被删除

    dropna(subset = [‘列名’]), 指定当某列出现空值才删除

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', None, 21, 176],
            ['二级', '游泳', None, 178],
            ['三级', '游泳', 21, 185],
            [None, '游泳', 19, None],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index=['小明', '小红', '小强', '小于']
    )
    print(dataFrame)
    print(dataFrame.dropna())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果:

          等级    爱好    年龄     身高
    小明    一级  None  21.0  176.0
    小红    二级    游泳   NaN  178.0
    小强    三级    游泳  21.0  185.0
    小于  None    游泳  19.0    NaN
        等级  爱好    年龄     身高
    小强  三级  游泳  21.0  185.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (4). 填充空值

    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', None, 21, 176],
            ['二级', '游泳', None, 178],
            ['三级', '游泳', 21, 185],
            [None, '游泳', 19, None],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index=['小明', '小红', '小强', '小于']
    )
    print(dataFrame)
    dataFrame['年龄'] = dataFrame['年龄'].fillna(20)
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    结果:

    小明    一级  None  21.0  176.0
    小红    二级    游泳   NaN  178.0
    小强    三级    游泳  21.0  185.0
    小于  None    游泳  19.0    NaN
          等级    爱好    年龄     身高
    小明    一级  None  21.0  176.0
    小红    二级    游泳  20.0  178.0
    小强    三级    游泳  21.0  185.0
    小于  None    游泳  19.0    NaN
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4. 去重

    函数作用
    .dropduplicates(subset = 列名列表, keep = 'first' 或 'last')删除完全重复行, 可指定某字段重复时删除, 默认保留第一个, 后面重复的会删掉
    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', None, 21, 176],
            ['二级', '游泳', None, 178],
            ['三级', '游泳', 21, 185],
            [None, '游泳', 19, None],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index=['小明', '小红', '小强', '小于']
    )
    print(dataFrame)
    print(dataFrame.drop_duplicates(subset = ['爱好'], keep = 'first'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果:

          等级    爱好    年龄     身高
    小明    一级  None  21.0  176.0
    小红    二级    游泳   NaN  178.0
    小强    三级    游泳  21.0  185.0
    小于  None    游泳  19.0    NaN
        等级    爱好    年龄     身高
    小明  一级  None  21.0  176.0
    小红  二级    游泳   NaN  178.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5. 排序

    函数作用
    .sort_values(by = 列名, ascending = 是否升序)对某列排序
    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', None, 21, 176],
            ['二级', '游泳', None, 178],
            ['三级', '游泳', 21, 185],
            [None, '游泳', 19, None],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index=['小明', '小红', '小强', '小于']
    )
    print(dataFrame)
    dataFrame = dataFrame.sort_values(by = '等级', ascending = True)
    print(dataFrame)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    结果:

          等级    爱好    年龄     身高
    小明    一级  None  21.0  176.0
    小红    二级    游泳   NaN  178.0
    小强    三级    游泳  21.0  185.0
    小于  None    游泳  19.0    NaN
          等级    爱好    年龄     身高
    小明    一级  None  21.0  176.0
    小强    三级    游泳  21.0  185.0
    小红    二级    游泳   NaN  178.0
    小于  None    游泳  19.0    NaN
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    6. 分组

    分组就是把指定的一列的值相同的分为一组, 调用一些函数对这些指定列值相同数据进行操作

    函数作用
    .groupby('列名')对指定列分组, 就是把该列值一样的分成一组
    计算值函数作用
    sum()组内求和
    max()组内求最大值
    min()组内求最小值
    std()组内求标准差
    mean()组内求平均数
    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', '读书', 21, 176],
            ['二级', '游泳', 20, 178],
            ['三级', '游泳', 21, 185],
            ['四级', '游泳', 19, 177],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index=['小明', '小红', '小强', '小于']
    )
    print(dataFrame)
    groupData = dataFrame.groupby('年龄')
    print(groupData)
    print(groupData.sum())
    print(groupData.max())
    print(groupData.min())
    print(groupData.std())
    print(groupData.mean())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    结果:

        等级  爱好  年龄   身高
    小明  一级  读书  21  176
    小红  二级  游泳  20  178
    小强  三级  游泳  21  185
    小于  四级  游泳  19  177
    <pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001E4FB3E4730>
         身高
    年龄     
    19  177
    20  178
    21  361
        等级  爱好   身高
    年龄             
    19  四级  游泳  177
    20  二级  游泳  178
    21  三级  读书  185
        等级  爱好   身高
    年龄             
    19  四级  游泳  177
    20  二级  游泳  178
    21  一级  游泳  176
              身高
    年龄          
    19       NaN
    20       NaN
    21  6.363961
           身高
    年龄       
    19  177.0
    20  178.0
    21  180.5
    
    • 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

    可以指定分组后的数据的列进行操作

    dataFrame = pandas.DataFrame(
        data=[
            ['一级', '读书', 21, 176],
            ['二级', '游泳', 20, 178],
            ['三级', '游泳', 21, 185],
            ['四级', '游泳', 19, 177],
            ['四级', '读书', 19, 165],
            ['四级', '读书', 19, 190],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index=['小明', '小红', '小强', '小于', '小兰', '小智']
    )
    print(dataFrame)
    groupData = dataFrame.groupby('年龄')
    groupData = groupData['身高']
    print(groupData.sum())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    结果:

        等级  爱好  年龄   身高
    小明  一级  读书  21  176
    小红  二级  游泳  20  178
    小强  三级  游泳  21  185
    小于  四级  游泳  19  177
    小兰  四级  读书  19  165
    小智  四级  读书  19  190
    年龄
    19    532
    20    178
    21    361
    Name: 身高, dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    7. 分段

    函数作用
    cut(x = 切分数据, bins = 切分方式, right = 是否包含右区间, labels = 分割后每段的名字列表)对一个数组进行分段
    import pandas
    
    dataFrame = pandas.DataFrame(
        data=[
            ['一级', '读书', 21, 176],
            ['二级', '游泳', 20, 178],
            ['三级', '游泳', 21, 185],
            ['四级', '游泳', 19, 177],
            ['四级', '读书', 19, 165],
            ['四级', '读书', 19, 190],
        ],
        columns=['等级', '爱好', '年龄', '身高'],
        index=['小明', '小红', '小强', '小于', '小兰', '小智']
    )
    r = pandas.cut(x = dataFrame['身高'], bins = [160, 170, 180, 190, 200], right = False, labels = ['中等身高', '身高较高', '身高很高', '身高太高'])
    print(r, end = '\n')
    r = pandas.cut(x=dataFrame['身高'], bins = 4, right=False, labels=['中等身高', '身高较高', '身高很高', '身高太高'])
    print(r)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    结果:

    小明    身高较高
    小红    身高较高
    小强    身高很高
    小于    身高较高
    小兰    中等身高
    小智    身高太高
    Name: 身高, dtype: category
    Categories (4, object): ['中等身高' < '身高较高' < '身高很高' < '身高太高']
    小明    身高较高
    小红    身高很高
    小强    身高太高
    小于    身高较高
    小兰    中等身高
    小智    身高太高
    Name: 身高, dtype: category
    Categories (4, object): ['中等身高' < '身高较高' < '身高很高' < '身高太高']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    Python学习笔记--枚举类的使用
    DASCTF X GFCTF 2022十月挑战赛 - pwn
    vue异步加载数据 传递给 子组件,触发mounted方法,子组件修改父组件值
    Three.js 进阶之旅:物理效果-碰撞和声音 💥
    前端 JS 经典:JSON 对象
    leetcode 907. 子数组的最小值之和(重做)
    Tomcat介绍
    knife4j 简单使用
    innovus笔记——mem(macro)太多,怎么才能摆出符合数据流的mem呢?
    新一轮消费浪潮席卷而来,中国科技驱动行业新发展
  • 原文地址:https://blog.csdn.net/qq_37354060/article/details/125024503