• 小白学 Python 数据分析(7):Pandas (六)数据导入


    人生苦短,我用 Python

    前文传送门:

    小白学 Python 数据分析(1):数据分析基础

    小白学 Python 数据分析(2):Pandas (一)概述

    小白学 Python 数据分析(3):Pandas (二)数据结构 Series

    小白学 Python 数据分析(4):Pandas (三)数据结构 DataFrame

    小白学 Python 数据分析(5):Pandas (四)基础操作(1)查看数据

    小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择

    引言

    前面几篇我们介绍了 Pandas 的一些基础操作,有同学在后台给小编留言,纯粹的介绍 API 太无聊了,那么,小编这篇就来点有用的东西,希望大家能在以后的工作生活中都用得上。

    本篇主要介绍如何将数据导入 Pandas 进行一些简单的操作。

    操作的数据源嘛,就选择小编对自己博客站数据的抓取,这里小编将自己的博客数据导出成了两种格式, Excel 和 CSV ,各位同学在平常的工作生活中能接触的应该也是这两种格式。

    Excel 数据导入

    导入 Excel 数据主要使用到的方法是 Pandas 中的 read_excel()

    在进行导入操作的时候,要注意文件路径,这里的文件路径可以使用相对路径也可以使用绝对路径,但是不管哪种路径最基本的是要写对。

    小编先使用相对路径做个演示:

    import pandas as pd
    
    df = pd.read_excel("result_data.xlsx")
    print(df)
    
    # 输出内容
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog       215         0       118         0 2019-11-23 23:00:10
    1      juejin       177         0        -2         1 2019-11-23 23:00:03
    2        csdn      1652        69         0        24 2019-11-23 23:00:02
    3      cnblog       650         3       191         0 2019-11-22 23:00:15
    4      juejin       272         3       -23         1 2019-11-22 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    403    juejin       212         0        -1         2 2020-02-20 23:00:02
    404      csdn      1602         1         0         1 2020-02-20 23:00:01
    405    cnblog        19         0        41         0 2020-02-21 23:00:05
    406    juejin       125         1        -4         0 2020-02-21 23:00:02
    407      csdn      1475         8         0         3 2020-02-21 23:00:02
    
    [408 rows x 6 columns]
    

    因为小编这里的 Excel 就放在代码的同级目录,所以直接写文件名即可,接下来演示绝对路径。

    由于小编的操作系统是 Windows 的操作系统,文件路径默认是使用 ,如 D:DevelopmentProjectspython-learningpython-data-analysispandas-demo esult_data.xlsx ,我们在直接使用 Windows 的文件路径的时候需要在前面增加一个 r (转义符)避免路径中的 被转义,如下:

    import pandas as pd
    df = pd.read_excel(r"D:DevelopmentProjectspython-learningpython-data-analysispandas-demo
    esult_data.xlsx")
    print(df)
    
    # 输出内容
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog       215         0       118         0 2019-11-23 23:00:10
    1      juejin       177         0        -2         1 2019-11-23 23:00:03
    2        csdn      1652        69         0        24 2019-11-23 23:00:02
    3      cnblog       650         3       191         0 2019-11-22 23:00:15
    4      juejin       272         3       -23         1 2019-11-22 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    403    juejin       212         0        -1         2 2020-02-20 23:00:02
    404      csdn      1602         1         0         1 2020-02-20 23:00:01
    405    cnblog        19         0        41         0 2020-02-21 23:00:05
    406    juejin       125         1        -4         0 2020-02-21 23:00:02
    407      csdn      1475         8         0         3 2020-02-21 23:00:02
    
    [408 rows x 6 columns]
    

    当然,如果不想使用这个转义符 r 也行,这样需要修改下文件的路径,将所有的 变成 / ,这个规则适用于其他所有的文件路径操作,示例如下:

    import pandas as pd
    df = pd.read_excel("D:/Development/Projects/python-learning/python-data-analysis/pandas-demo/result_data.xlsx")
    print(df)
    
    # 输出内容
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog       215         0       118         0 2019-11-23 23:00:10
    1      juejin       177         0        -2         1 2019-11-23 23:00:03
    2        csdn      1652        69         0        24 2019-11-23 23:00:02
    3      cnblog       650         3       191         0 2019-11-22 23:00:15
    4      juejin       272         3       -23         1 2019-11-22 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    403    juejin       212         0        -1         2 2020-02-20 23:00:02
    404      csdn      1602         1         0         1 2020-02-20 23:00:01
    405    cnblog        19         0        41         0 2020-02-21 23:00:05
    406    juejin       125         1        -4         0 2020-02-21 23:00:02
    407      csdn      1475         8         0         3 2020-02-21 23:00:02
    
    [408 rows x 6 columns]
    

    出于使用简单考虑,小编推荐直接在路径前面加 r ,剩下的文件路径直接使用 CV 大法就好。

    指定导入 Sheet

    我们在使用 Excel 导入的时候,除了可以指定文件路径,还可以选择导入的 Sheet ,如果不知道 Sheet 是什么的同学,建议出门左转。

    在设置 Sheet 的时候,我们使用参数 sheet_name 来完成,示例如下:

    import pandas as pd
    
    df = pd.read_excel(r"D:DevelopmentProjectspython-learningpython-data-analysispandas-demo
    esult_data.xlsx", sheet_name='result_data')
    print(df)
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog       215         0       118         0 2019-11-23 23:00:10
    1      juejin       177         0        -2         1 2019-11-23 23:00:03
    2        csdn      1652        69         0        24 2019-11-23 23:00:02
    3      cnblog       650         3       191         0 2019-11-22 23:00:15
    4      juejin       272         3       -23         1 2019-11-22 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    403    juejin       212         0        -1         2 2020-02-20 23:00:02
    404      csdn      1602         1         0         1 2020-02-20 23:00:01
    405    cnblog        19         0        41         0 2020-02-21 23:00:05
    406    juejin       125         1        -4         0 2020-02-21 23:00:02
    407      csdn      1475         8         0         3 2020-02-21 23:00:02
    
    [408 rows x 6 columns]
    

    如果我们要使用一个完全不存在的 Sheet 名称会发生什么事情呢?例如我们将上面的 sheet_name 修改为 aaa ,来看下:

    import pandas as pd
    
    df = pd.read_excel(r"D:DevelopmentProjectspython-learningpython-data-analysispandas-demo
    esult_data.xlsx", sheet_name='aaa')
    print(df)
    
    # 输出结果
    Traceback (most recent call last):
      File "C:UsersinwsyAppDataLocalProgramsPythonPython37libsite-packagesxlrdook.py", line 474, in sheet_by_name
        sheetx = self._sheet_names.index(sheet_name)
    ValueError: 'aaa' is not in list
    
    During handling of the above exception, another exception occurred:
    

    可以看到这里抛出了 ValueError 的异常,并且提示 aaa 不在列表中。

    在指定 Sheet 名称的时候除了可以使用 Sheet 的具体名称,还可以使用 Sheet 的顺序,需要注意这个顺序开头是从 0 开始的。

    import pandas as pd
    
    df = pd.read_excel(r"D:DevelopmentProjectspython-learningpython-data-analysispandas-demo
    esult_data.xlsx", sheet_name=0)
    print(df)
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog       215         0       118         0 2019-11-23 23:00:10
    1      juejin       177         0        -2         1 2019-11-23 23:00:03
    2        csdn      1652        69         0        24 2019-11-23 23:00:02
    3      cnblog       650         3       191         0 2019-11-22 23:00:15
    4      juejin       272         3       -23         1 2019-11-22 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    403    juejin       212         0        -1         2 2020-02-20 23:00:02
    404      csdn      1602         1         0         1 2020-02-20 23:00:01
    405    cnblog        19         0        41         0 2020-02-21 23:00:05
    406    juejin       125         1        -4         0 2020-02-21 23:00:02
    407      csdn      1475         8         0         3 2020-02-21 23:00:02
    
    [408 rows x 6 columns]
    

    如果这里指定的顺序是一个不存在的顺序,一样会抛出异常 IndexError ,这里小编就不做演示了。

    指定导入行索引

    我们在导入文件的时候,行索引默认是会使用从 0 开始的默认索引,如果对行索引有需求的话,可以使用 index_col 参数来设置行索引。

    比如我们现在设置 create_date 这个参数作为行索引,注意参数起始从 0 开始:

    import pandas as pd
    
    df = pd.read_excel(r"D:DevelopmentProjectspython-learningpython-data-analysispandas-demo
    esult_data.xlsx", sheet_name=0, index_col=5)
    print(df)
    
    # 输出结果
                        plantform  read_num  fans_num  rank_num  like_num
    create_date                                                          
    2019-11-23 23:00:10    cnblog       215         0       118         0
    2019-11-23 23:00:03    juejin       177         0        -2         1
    2019-11-23 23:00:02      csdn      1652        69         0        24
    2019-11-22 23:00:15    cnblog       650         3       191         0
    2019-11-22 23:00:02    juejin       272         3       -23         1
    ...                       ...       ...       ...       ...       ...
    2020-02-20 23:00:02    juejin       212         0        -1         2
    2020-02-20 23:00:01      csdn      1602         1         0         1
    2020-02-21 23:00:05    cnblog        19         0        41         0
    2020-02-21 23:00:02    juejin       125         1        -4         0
    2020-02-21 23:00:02      csdn      1475         8         0         3
    
    [408 rows x 5 columns]
    

    指定导入列索引

    同行索引一样,默认也是采用源数据的第一行作为列索引,同样,我们可以通过 header 进行列索引的设置, header 的默认参数为 0 ,也就是第一行,自定义可以使用其他行,将行号作为参数传入即可,我们演示一下使用第二行作为索引:

    import pandas as pd
    
    df = pd.read_excel(r"D:DevelopmentProjectspython-learningpython-data-analysispandas-demo
    esult_data.xlsx", sheet_name=0, header=1)
    print(df)
    
    # 输出结果
         cnblog   215    0  118  0.1 2019-11-23 23:00:10
    0    juejin   177    0   -2    1 2019-11-23 23:00:03
    1      csdn  1652   69    0   24 2019-11-23 23:00:02
    2    cnblog   650    3  191    0 2019-11-22 23:00:15
    3    juejin   272    3  -23    1 2019-11-22 23:00:02
    4      csdn  2202  129    0   37 2019-11-22 23:00:01
    ..      ...   ...  ...  ...  ...                 ...
    402  juejin   212    0   -1    2 2020-02-20 23:00:02
    403    csdn  1602    1    0    1 2020-02-20 23:00:01
    404  cnblog    19    0   41    0 2020-02-21 23:00:05
    405  juejin   125    1   -4    0 2020-02-21 23:00:02
    406    csdn  1475    8    0    3 2020-02-21 23:00:02
    
    [407 rows x 6 columns]
    

    指定导入行数

    有时候,如果我们只需要了解一下这个文件中有些什么数据,那么我们就不需要导入所有的数据,可以使用 nrows 来指定导入的行数,这里我们选择导入 Excel 的前 100 行:

    import pandas as pd
    
    df = pd.read_excel(r"D:DevelopmentProjectspython-learningpython-data-analysispandas-demo
    esult_data.xlsx", sheet_name=0, nrows=100)
    print(df)
    
    # 输出结果
       plantform  read_num  fans_num  rank_num  like_num         create_date
    0     cnblog       215         0       118         0 2019-11-23 23:00:10
    1     juejin       177         0        -2         1 2019-11-23 23:00:03
    2       csdn      1652        69         0        24 2019-11-23 23:00:02
    3     cnblog       650         3       191         0 2019-11-22 23:00:15
    4     juejin       272         3       -23         1 2019-11-22 23:00:02
    ..       ...       ...       ...       ...       ...                 ...
    95      csdn      1492        88         0        13 2019-10-23 23:51:37
    96    cnblog      1338         2       219         0 2019-10-22 23:33:33
    97    juejin       204         1        -6         6 2019-10-22 23:18:19
    98      csdn      1064        61      7094        18 2019-10-22 23:18:08
    99    cnblog      -493         1        69         0 2019-10-21 22:38:32
    
    [100 rows x 6 columns]
    

    从结果的数据统计,可以看到我们成功的导入了前 100 行的数据,虽然行索引只有 99 ,是因为么我们 Excel 的头也占了一行。

    指定导入列

    有时候,我们的 Excel 中的列太多了,而我们处理的数据又不需要那么多列的时候,我们可以使用 usecols 来指定我们需要导入的列:

    import pandas as pd
    
    df = pd.read_excel(r"D:DevelopmentProjectspython-learningpython-data-analysispandas-demo
    esult_data.xlsx", sheet_name=0, usecols=[0, 1, 2])
    print(df)
    
    # 输出结果
        plantform  read_num  fans_num
    0      cnblog       215         0
    1      juejin       177         0
    2        csdn      1652        69
    3      cnblog       650         3
    4      juejin       272         3
    ..        ...       ...       ...
    403    juejin       212         0
    404      csdn      1602         1
    405    cnblog        19         0
    406    juejin       125         1
    407      csdn      1475         8
    
    [408 rows x 3 columns]
    

    注意这里的 usecols 的参数是一个数组,表示我们将要导入的列。

    CSV 数据导入

    前面我们介绍了如何导入 Excel 的数据,我们接着介绍如何导入 CSV 的数据,首先还是使用 read_csv 导入 CSV 的文件:

    import pandas as pd
    
    df = pd.read_csv(r"D:DevelopmentProjectspython-learningpython-data-analysispandas-demo
    esult_data.csv")
    print(df)
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num          create_date
    0      cnblog       215         0       118         0  23/11/2019 23:00:10
    1      juejin       177         0        -2         1  23/11/2019 23:00:03
    2        csdn      1652        69         0        24  23/11/2019 23:00:02
    3      cnblog       650         3       191         0  22/11/2019 23:00:15
    4      juejin       272         3       -23         1  22/11/2019 23:00:02
    ..        ...       ...       ...       ...       ...                  ...
    403    juejin       212         0        -1         2   20/2/2020 23:00:02
    404      csdn      1602         1         0         1   20/2/2020 23:00:01
    405    cnblog        19         0        41         0   21/2/2020 23:00:05
    406    juejin       125         1        -4         0   21/2/2020 23:00:02
    407      csdn      1475         8         0         3   21/2/2020 23:00:02
    
    [408 rows x 6 columns]
    

    可以看到,和上面的 Excel 导入的数据保持一致,只是后面的时间日期类型格式化有点区别。

    其余的操作和上面介绍的 Excel 是一样的,这里就不一一列举了,有一个需要注意的点是,编码格式的指定,这时我们需要设置 encoding 参数,如果不做设置,那么默认的指定格式是 utf-8 的,因为常用的格式除了 utf-8 还会有 gbkgb2312 等等。

    import pandas as pd
    
    # 指定编码格式
    df = pd.read_csv(r"D:DevelopmentProjectspython-learningpython-data-analysispandas-demo
    esult_data.csv", encoding='utf-8')
    print(df)
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num          create_date
    0      cnblog       215         0       118         0  23/11/2019 23:00:10
    1      juejin       177         0        -2         1  23/11/2019 23:00:03
    2        csdn      1652        69         0        24  23/11/2019 23:00:02
    3      cnblog       650         3       191         0  22/11/2019 23:00:15
    4      juejin       272         3       -23         1  22/11/2019 23:00:02
    ..        ...       ...       ...       ...       ...                  ...
    403    juejin       212         0        -1         2   20/2/2020 23:00:02
    404      csdn      1602         1         0         1   20/2/2020 23:00:01
    405    cnblog        19         0        41         0   21/2/2020 23:00:05
    406    juejin       125         1        -4         0   21/2/2020 23:00:02
    407      csdn      1475         8         0         3   21/2/2020 23:00:02
    
    [408 rows x 6 columns]
    

    因为小编这里的编码格式是 utf-8 ,所以这里对编码格式的设置是 encoding='utf-8'

    导入数据库数据

    数据库有很多种,在连接数据库的时候需要使用不同的驱动,因为小编这里使用的 MySQL 数据库,所以使用的驱动为 pymsql ,在使用的事情需要先创建数据库连接。

    import pymysql
    
    con = pymysql.connect(host='',
                             port=,
                             user='',
                             password='',
                             db='',
                             charset='')
    

    这里的参数需要各位自行填写,用来配置 MySQL 连接的参数。

    配置好数据库连接以后,我们使用的是 read_sql 这个方法直接执行 sql 语句获取数据,完整的代码如下:

    import pandas as pd
    import pymysql
    
    con = pymysql.connect(host='',
                             port=,
                             user='',
                             password='',
                             db='',
                             charset='')
    
    sql = 'select * from result_data'
    
    df = pd.read_sql(sql, con)
    print(df)
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog       215         0       118         0 2019-11-23 23:00:10
    1      juejin       177         0        -2         1 2019-11-23 23:00:03
    2        csdn      1652        69         0        24 2019-11-23 23:00:02
    3      cnblog       650         3       191         0 2019-11-22 23:00:15
    4      juejin       272         3       -23         1 2019-11-22 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    406    juejin       125         1        -4         0 2020-02-21 23:00:02
    407      csdn      1475         8         0         3 2020-02-21 23:00:02
    408    cnblog        56         0        33         0 2020-02-22 23:00:06
    409    juejin        83         0        -1         0 2020-02-22 23:00:02
    410      csdn      2094        10         0         4 2020-02-22 23:00:02
    
    [411 rows x 6 columns]
    

    这里的结果比前面的 Excel 多几行是因为时间关系,Excel 导出的时间稍微早了一点。

    简单使用

    当我们获取到数据以后,在来几个我们前面介绍过的简单操作。

    使用 head 预览前几行数据:

    print(df.head(5))
    
    # 输出结果
      plantform  read_num  fans_num  rank_num  like_num         create_date
    0    cnblog       215         0       118         0 2019-11-23 23:00:10
    1    juejin       177         0        -2         1 2019-11-23 23:00:03
    2      csdn      1652        69         0        24 2019-11-23 23:00:02
    3    cnblog       650         3       191         0 2019-11-22 23:00:15
    4    juejin       272         3       -23         1 2019-11-22 23:00:02
    

    获取数据表的大小,这里使用的是 shape

    print(df.shape)
    
    # 输出结果
    (411, 6)
    

    获取数值分布,使用 describe()

    print(df.describe())
    
    # 输出结果
               read_num    fans_num      rank_num    like_num
    count    411.000000  411.000000    411.000000  411.000000
    mean     521.199513    9.111922    234.632603    4.347932
    std     2899.915738   19.021352   1437.427594    7.829470
    min   -54600.000000   -1.000000    -25.000000    0.000000
    25%       83.500000    0.000000     -1.000000    0.000000
    50%      288.000000    2.000000      0.000000    1.000000
    75%      788.000000    7.000000     38.000000    5.000000
    max     7083.000000  129.000000  21720.000000   57.000000
    

    本次的分享先到这里了,因为最近都没写原创,本篇内容稍微长了点,希望各位同学还是能耐着性子自己写写代码,文章中相关涉及到的文件都上传代码仓库了,有需要的同学可以自行取用。

    示例代码

    老规矩,所有的示例代码都会上传至代码管理仓库 Github 和 Gitee 上,方便大家取用。

    示例代码-Github

    示例代码-Gitee

  • 相关阅读:
    [BZOJ4553][TJOI2016&HEOI2016]序列
    树套树乱讲的代码
    树套树乱讲
    [Luogu4174][NOI2006]最大获益
    [BZOJ3879]SvT
    [BZOJ3611][HEOI2014]大工程
    [BZOJ1501][NOI2005]智慧珠游戏
    [BZOJ1499][NOI2005]瑰丽华尔兹
    [BZOJ3460] Jc的宿舍
    [HDU4812]D Tree
  • 原文地址:https://www.cnblogs.com/babycomeon/p/12355748.html
Copyright © 2020-2023  润新知