• Python数据分析之pandas(保姆级教程)


    一、前言

    一般情况下,numpy总是和pandas一起出现。如果numpy处理的数据类似于list类型的话,那么pandas处理的数据就类似于dictionary类型。

    二、前提准备

    使用pandas的话,需要将pandas这个第三方包,提前下载到你的python解释器中。
    (1)Win + R,输入cmd,然后点击确定
    在这里插入图片描述
    (2)在Windows的终端中输入如下命令,然后回车

    pip install pandas
    
    • 1

    在这里插入图片描述

    三、具体使用

    1.基本使用

    (1)使用pandas生成序列

    # coding:utf-8
    import pandas as pd
    import numpy as np
    # 通过pandas生成序列
    
    # NAN :not a number,但是类型是float
    s = pd.Series([1, 3, 6, np.NAN, 66, 88])
    print(s)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    (2)生成日期序列

    # 生成一个日期序列,生成六个数据
    dates = pd.date_range('20220822', periods=6)
    print(dates)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    (3)生成DataFrame

    # 6行4列 ,日期使用的是上面的8.22到8.27
    # DataFrame非常类似于Excel表格,最左侧为行名称,最上面是列名称
    # index代表行名称,column代表列名称
    df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=['a', 'b', 'c', 'd'])
    print(df)
    
    print("-" * 50)
    # 使用DataFrame的默认行名称和列名称
    df1 = pd.DataFrame(np.arange(12).reshape((3, 4)))
    print(df1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    (4)使用字典参数生成DataFrame

    # 使用字典作为DateFrame的参数
    # 字典的key作为列名,value作为一列中的数值,行数取决于列中最多元素数量
    df2 = pd.DataFrame({'A': 1.0, 'B': pd.Timestamp('20210701'),
                        'C': pd.Categorical(['test1', 'test2', 'test3', 'test4']), 'D': 'ff'})
    print(df2)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    (5)Dataframe的属性

    # 输出数据类型
    print(df2.dtypes)
    # 打印行名称
    print(df2.index)
    # 打印列名称
    print(df2.columns)
    
    # 打印值
    print(df2.values)
    # 打印描述信息
    print(df2.describe())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    (6)在Dataframe中进行排序

    # 排序, axis=1指的是列名称;axis=0指的是行名称,ascending=False表示逆序
    df2 = df2.sort_index(axis=1, ascending=False)
    
    print(df2)
    print("-" * 50)
    df2 = df2.sort_index(axis=0, ascending=False)
    print(df2)
    
    print("%" * 50)
    # 根据C列数值进行排序
    df2 = df2.sort_values(by='C')
    print(df2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    (7)对Dataframe进行转置

    # 转置
    print(df2.T)
    
    • 1
    • 2

    在这里插入图片描述

    2.选择数据

    (1)选择列

    # coding:utf-8
    import numpy as np
    import pandas as pd
    """
        pandas从DateFrame中选取一行
    """
    
    # 生成日期序列
    dates = pd.date_range('2022.07.01', periods=6)
    
    # 生成DateFrame
    df = pd.DataFrame(np.arange(24).reshape((6,4)), index=dates, columns=['A', 'B', 'C', 'D'])
    print(df)
    # 选取第A列
    print(df.A)
    print("-" * 50)
    print(df['A'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    (2)通过“切片”选择数据

    print("-" * 50)
    # 按行切片,左闭右开
    print(df[1:3])
    print("&" * 50)
    
    # 按行索引名进行切片,左闭右闭
    print(df['20220703':'20220705'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    (3)根据标签进行选择数据

    # 根据行标签(行名)进行选取值
    print("-" * 50)
    print(df.loc['20220701'])
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    # 选取列标签
    print("-" * 50)
    # 所有行中的B、C两列
    print(df.loc[:, ['B', 'C']])
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    # 输出指定行中的,指定列
    print("-" * 50)
    print(df.loc["20220702", ['C', 'D']])
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    (4)根据位置选择数据

    # 根据位置进行筛选
    print("-" * 50)
    print(df.iloc[3])
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    print("-" * 50)
    print(df.iloc[[1,3,5], 1:3])
    
    • 1
    • 2

    在这里插入图片描述

    (5)根据条件进行选择数据

    # 通过条件进行筛选,通过A列进行筛选,显示所有的信息
    print("-" * 50)
    print(df[df.A > 8])
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    3. 设置值

    设置值的本质就是:先选择数据,然后再赋值

    (1)通过位置选择数据,然后改变数据

    # coding:utf-8
    import numpy as np
    import pandas as pd
    
    """
       在指定位置进行替换值 
    """
    
    dates = pd.date_range('20220701', periods=6)
    # print(dates)
    df = pd.DataFrame(np.arange(24).reshape((6,4)), index=dates, columns=['A', 'B', 'C', 'D'])
    print(df)
    
    # 改变指定位置的值
    # 通过位置进行改变
    df.iloc[2, 2] = 666
    print("-" * 50)
    print(df)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    (2)通过标签选择数据,然后改变数据

    # 通过标签进行改变
    df.loc['20220701', 'B'] = 999
    print("-" * 50)
    print(df)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    (3)通过选择列选择数据,然后改变数据

    df['D'] = np.NAN
    print(df)
    
    • 1
    • 2

    在这里插入图片描述

    (4)给Dataframe新加一列

    # 在DataFrame上新加一列
    df['E'] = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range('20220701', periods=6))
    print("-" * 50)
    print(df)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    (5)通过条件选择数据,然后改变数据

    # 条件判断,只要A列中有大于0的所有行的所有数据全部改变!
    # 中括号中,进行的筛选是:筛选A列中的行
    df[df.A > 0] = 2222
    print(df)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    4.处理丢失数据

    (1)丢弃NaN值

    # coding:utf-8
    import numpy as np
    import pandas as pd
    
    dates = pd.date_range('20220701', periods=6)
    # print(dates)
    df = pd.DataFrame(np.arange(24).reshape(6, 4), index=dates, columns=['A', 'B', 'C', 'D'])
    # print(df)
    
    # 改变数据
    df.iloc[0, 1] = np.NAN
    df.iloc[1, 2] = np.NAN
    print("-" * 50)
    print(df)
    
    
    """
        丢弃nan
    """
    
    # 丢弃nan, anis=1表示列方向, how的方式是:
    # all的话,就是一整行或者一整列都是nan的话,才进行丢弃
    # any的话,只要一行里面或者一列里面有nan,就丢弃整行或者整列
    df = df.dropna(axis=1, how='any')
    print("-" * 50)
    print(df)
    
    • 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

    在这里插入图片描述

    (2)替换NaN值

    """
        替换nan
    """
    
    print(df.fillna(value=0))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    (3)判断df的各个位置上是否缺失数据

    # 看看是否缺失数据,
    # 在Dataframe的对应元素位置上进行判断,如果缺失显示True;如果不缺失显示False
    print(df.isnull())
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    (4)判断df中是否存在NaN值

    # 看看df中是否有NaN
    print("-" * 50)
    print(np.any(df.isnull()) == True)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    5.导入导出数据

    (1)读取数据

    import numpy as np
    import pandas as pd
    """
        用pandas导入导出数据
    """
    
    # 读取数据,可以读取各自格式的数据。比如:read_csv、read_excel、read_html
    data = pd.read_csv("AAH691(2).csv", encoding='gb18030')
    print(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    (2)存储数据

    # 保存成pickle格式的文件,也可以保存成其他格式的问题,比如csv、html等。与读取一一对应
    # 保存数据
    data.to_pickle('test.pickle')
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    在这里插入图片描述

    6.使用contact合并Dataframe

    (1)contact竖直方向合并

    # coding:utf-8
    import numpy as np
    import pandas as pd
    
    """
        pandas中的合并
    """
    
    # 创建数据框架
    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("-" * 50)
    print(df1)
    print("-" * 50)
    print(df2)
    print("-" * 50)
    print(df3)
    
    # 使用函数,在竖直方向进行合并, axis为0时,表示竖直方向的合并
    print("-" * 50)
    # ignore_index=True表示对合并之后的数据进行重新排序
    res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
    print(res)
    
    • 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

    在这里插入图片描述

    (2)contact水平方向合并

    # 使用函数,在竖直方向进行合并, axis为0时,表示竖直方向的合并
    # axis为1时,表示水平方向的合并
    print("-" * 50)
    # ignore_index=True表示对合并之后的数据进行重新排序
    res = pd.concat([df1, df2, df3], axis=1)
    print(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    (3)outer方式合并

    print("-" * 50)
    df1 = pd.DataFrame(np.ones((3, 4))*0, columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
    df2 = pd.DataFrame(np.ones((3, 4))*2, columns=['b', 'c', 'd', 'e'], index=[2, 3, 4])
    print(df1)
    print("-" * 50)
    print(df2)
    
    # 使用concat进行合并
    # 默认join是outer; 也可以使用inner
    # inner合并相同列;outer全部并起来,没有的列用NaN填充
    # ignore_index使得合并之后,顺序井然
    # inner类似于交集,outer类似于并集
    res = pd.concat([df1, df2], join="outer", ignore_index=True)
    print("-" * 50)
    print(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    (4)inner方式合并

    # 使用concat进行合并
    # 默认join是outer; 也可以使用inner
    # inner合并相同列;outer全部并起来,没有的列用NaN填充
    # ignore_index使得合并之后,顺序井然
    # inner类似于交集,outer类似于并集
    res = pd.concat([df1, df2], join="inner", ignore_index=True)
    print("-" * 50)
    print(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    (5)使用append进行添加df

    """
        append的使用,默认数据框架df进行纵向合并,添加到最下面
    """
    df1 = pd.DataFrame(np.ones((3, 4))*0, columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
    df2 = pd.DataFrame(np.ones((3, 4))*2, columns=['a', 'b', 'c', 'd'], index=[2, 3, 4])
    df3 = pd.DataFrame(np.ones((3, 4))*3, columns=['a', 'b', 'c', 'd'], index=[2, 3, 4])
    print("-" * 50)
    print(df1)
    print("-" * 50)
    print(df2)
    print("-" * 50)
    print(df3)
    print("-" * 50)
    # 参数ignore_index为True是为了让索引有序!!!
    res = df1.append([df2, df3], ignore_index=True)
    print(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    (6)使用append添加Series

    # 添加序列
    s1 = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
    print(s1)
    print("-" * 50)
    res = df1.append(s1, ignore_index=True)
    print(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    7.使用merge合并Dataframe

    (1)基于公共列进行合并

    # coding:utf-8
    import numpy as np
    import pandas as pd
    
    """
        merge的使用
    """
    
    # 可以将dataframe的格式理解成数据库中的表
    left = pd.DataFrame({'key':['K0', 'K1', 'K2', 'K3'],
                        'A':['A0', 'A1', 'A2', 'A3'],
                        'B':['B0', 'B1', 'B2', 'B3']})
    
    right = pd.DataFrame({'key':['K0', 'K1', 'K2', 'K3'],
                        'C':['C0', 'C1', 'C2', 'C3'],
                        'D':['D0', 'D1', 'D2', 'D3']})
    
    print(left)
    print("-" * 50)
    print(right)
    print("-" * 50)
    # 通过merge进行合并
    # 基于key列进行合并
    res = pd.merge(left, right, on='key')
    print(res)
    
    • 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

    在这里插入图片描述

    (2)inner形式的merge合并

    print("-" * 50)
    left = pd.DataFrame({'key1':['K0', 'K0', 'K1', 'K2'],
                         'key2':['K0', 'K1', 'K0', 'K1'],
                        'A':['A0', 'A1', 'A2', 'A3'],
                        'B':['B0', 'B1', 'B2', 'B3']})
    
    right = pd.DataFrame({'key1':['K0', 'K1', 'K1', 'K2'],
                          'key2':['K0', 'K0', 'K0', 'K0'],
                        'C':['C0', 'C1', 'C2', 'C3'],
                        'D':['D0', 'D1', 'D2', 'D3']})
    
    print(left)
    print("-" * 50)
    print(right)
    
    # 使用merge进行合并,默认合并方式是inner,去掉
    
    # how四种方式:inner 、outer 、left 、right
    print("-" * 50)
    res = pd.merge(left, right, on=['key1', 'key2'], how="inner")
    print(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    (3)outer形式的merge合并

    # 使用merge进行合并,默认合并方式是inner,去掉
    
    # how四种方式:inner 、outer 、left 、right
    print("-" * 50)
    res = pd.merge(left, right, on=['key1', 'key2'], how="outer")
    print(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    (4)right形式的merge合并

    # how四种方式:inner 、outer 、left 、right
    print("-" * 50)
    res = pd.merge(left, right, on=['key1', 'key2'], how="right")
    print(res)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    (5)left形式的merge合并

    # how四种方式:inner 、outer 、left 、right
    print("-" * 50)
    res = pd.merge(left, right, on=['key1', 'key2'], how="left")
    print(res)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    (6)merge参数之indicator

    df1 = pd.DataFrame({'col1':[0, 1], 'col_left':['a', 'b']})
    df2 = pd.DataFrame({'col1':[1, 2, 2], 'col_right':[2, 2, 2]})
    print("-" * 50)
    print(df1)
    print("-" * 50)
    print(df2)
    
    # indicator参数表示显示合并方式,indicator_column为显示合并方式列的列名
    res = pd.merge(df1, df2, on='col1', how='outer', indicator="indicator_column")
    print("-" * 50)
    print(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    (7)merge参数之index

    left = pd.DataFrame({'A':['A0', 'A1', 'A2'],
                         'B':['B0', 'B1', 'B2']},
                        index=['K0', 'K1', 'K2'])
    
    right = pd.DataFrame({'C':['C0', 'C1', 'C2'],
                          'D':['D0', 'D1', 'D2']},
                         index=['K0', 'K2', 'K3'])
    
    print("-" * 50)
    print(left)
    print("-" * 50)
    print(right)
    print("-" * 50)
    # 这里的how参数outer指的是,合并左侧索引和右侧索引
    res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
    print(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    (8)merge参数之suffixes

    boys = pd.DataFrame({'k':['K0', 'K1', 'K2'], 'age':[1, 2, 3]})
    girls = pd.DataFrame({'k':['K0', 'K0', 'K3'], 'age':[4, 5, 6]})
    
    print("-" * 50)
    print(boys)
    print("-" * 50)
    print(girls)
    
    # suffixes参数合并之后,重命名列名,在原来列表后面进行修改,以显示不同
    res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='outer')
    print("-" * 50)
    print(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    8. numpy和pandas处理数据之后,用matplotlib进行绘制图像

    (1)对Series数据进行绘制线性图

    # coding:utf-8
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    data = pd.Series(np.random.randn(1000), index=np.arange(1000))
    # 对数据进行累加
    data = data.cumsum()
    data.plot()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    (2)对Dataframe数据进行绘制线性图

    # 使用dataframe
    # 4代表生成4组数据
    data = pd.DataFrame(np.random.randn(1000, 4),
                        index=np.arange(1000),
                        columns=["A", "B", "C", "D"])
    
    # 进行累计
    data = data.cumsum()
    # print(data.head(5))
    data.plot()
    # 展示
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    (3)对Dataframe数据进行绘制散点图

    ax = data.plot.scatter(x='A', y='B', color='DarkBlue', label='Class 1')
    data.plot.scatter(x='A', y='C', color='DarkGreen', label='Class 2', ax=ax)
    plt.show()
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    pandas总结完毕,撒花撒花…

  • 相关阅读:
    JavaEE进阶:Maven
    Flask框架配置Celery-[2]:将前端上传的文件,通过异步任务保存,异步处理上传的文件
    机器学习 - 混淆矩阵:技术与实战全方位解析
    声纹技术(一):声纹技术的前世今生
    软考中级有用吗?
    4. algorithm
    leetcode day12 对称二叉树
    mysql第十六章 变量,流程控制触发器课后练习
    ChatGLM-6B-Int4运行有误
    主播产品话术
  • 原文地址:https://blog.csdn.net/Elon15/article/details/126467725