Python数据分析补充:数据的读取(文本、Excel、数据库)

一、文本文件读取

对于csv或txt文本文件,可以使用pandas模块中的read_table函数或者read_csv函数,它们的功能相同,区别在于各自函数中sep参数(即用于指定变量之间的分隔符)默认值不同,具体的参数如下所示:

read_tabel(filepath_or_buffer,sep='\t',header='infer',names=None,index_col=None,usecols=None,
dtype=None,converters=None,skiprows=None,skipfooter=None,nrows=None,na_values=None,
skip_blank_lines=True,parse_dates=False,thousand=None,comment=None,encoding=None)

具体的参数含义如下:

  • filepath_or_buffer:指定txt文件或csv文件所在的具体路径,除此还可以指定存储数据的网站链接。
  • sep:指定原数据集中各变量之间的分隔符,默认为tab制表符
  • header:是否需要将原数据集中的第一行作为表头,默认是需要的,并将第一行用作变量名称;如果原始数据中没有表头,该参数需要设置为None。
  • names:如果原数据集中没有变量名称,可以通过该参数在数据读取时给数据框添加具体的变量名称。
  • index_col:指定原数据集中的某些列作为数据框的行索引(标签)。
  • usecols:指定需要读取原数据集中的哪些变量名。
  • dtype:读取数据时,可以为原数据集的每个变量设置不同的数据类型。
  • converters:通过字典格式,为数据集中的某些变量设置转换函数。
  • skiprows:数据读取时,指定需要跳过原数据集的起始行数。
  • skipfootes:数据读取时,指定需要跳过原数据集的末尾行数。
  • nrows:指定数据读取的行数。
  • na_values:指定原数据集中哪些特征的值作为缺失值(默认将两个分隔符之间的空值作为缺失值)。
  • skip_blank_lines:读取数据时是否需要跳过原数据集中的空白行,默认为True。
  • parse_dates:如果参数值为True,则尝试解析数据框的行索引;如果参数为列表,则尝试解析对应的日期列;如果参数为嵌套列表,则将某些列合并为日期列;如果参数为字典,则解析对应的列(即字典中的值),并生成新的变量名(即字典中的键)。
  • thousands:指定原始数据集中的千分位符。
  • comment:指定注释符,在读取数据时,如果碰到行首指定的注释符,则跳过该行。
  • encoding:为防止中文的乱码,可以借助于该参数解决问题(通常设定为“utf-8”或“gbk”)。

我们也可以使用read_csv函数读取文本文件的数据,其参数与read_table函数完全一致,所不同的只是read_table函数在sep参数上的默认值是tab制表符,而read_csv函数在该参数上的默认值为英文状态下的逗号“,”。

为便于理解,如下图的txt文件,我们要讲其导入。
Python数据分析补充:数据的读取(文本、Excel、数据库)_第1张图片

import pandas as pd

data = pd.read_table(filepath_or_buffer=r'C:\Users\lin-a\Desktop\【数据分析从入门到进阶】配套数据\第5章\datas\data1.txt',#指定文件路径
                  sep=',',# 指定分隔符
                  header=None,# 不需要将原始数据中的第一行作为表头
                  names=['id','name','gender','occupation'],# 重新命名列索引名称
                  skiprows=2,# 跳过起始两行的数据
                  skipfooter=2,# 跳过末尾两行的数据
                  comment='#' ,# 不读取“#”开头的数据行
                  converters={'id':str}# 对工号转换数据类型,保留开头的00
                 )
data
C:\Users\lin-a\anaconda3\lib\site-packages\ipykernel_launcher.py:10: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support skipfooter; you can avoid this warning by specifying engine='python'.
  # Remove the CWD from sys.path while we load stuff.
id name gender occupation
0 00446 张敏 前端工程师
1 00483 李琴 Java开发工程师
2 00552 赵东来 数据分析师
3 00589 丁顺昌 数据分析师

由于以上代码运行后有异常提示,在代码最后加上一行“engine=‘python’”即可解决问题。

import pandas as pd

data = pd.read_table(filepath_or_buffer=r'C:\Users\lin-a\Desktop\【数据分析从入门到进阶】配套数据\第5章\datas\data1.txt',#指定文件路径
                  sep=',',# 指定分隔符
                  header=None,# 不需要将原始数据中的第一行作为表头
                  names=['id','name','gender','occupation'],# 重新命名列索引名称
                  skiprows=2,# 跳过起始两行的数据
                  skipfooter=2,# 跳过末尾两行的数据
                  comment='#' ,# 不读取“#”开头的数据行
                  converters={'id':str},# 对工号转换数据类型,保留开头的00
                  engine='python' 
                 )
data
id name gender occupation
0 00446 张敏 前端工程师
1 00483 李琴 Java开发工程师
2 00552 赵东来 数据分析师
3 00589 丁顺昌 数据分析师

代码运行结果显示,成功将txt文件内的数据读取到,而且为数据新增了变量名称。对于id变量而言,00开头的编号保持了原样。需要注意的是:

  • names参数的多个值是通过列表实现的;
  • converters参数的值则是通过字典实现的。

二、电子表格的读取

电子表格xlsx或xls文件的读取,可以使用read_excel函数:

read_excel(io,sheetname=0,header=0,skiprows=None,skip_footer=0,
           index_col=None,names=None,parse_dates=False,na_values=None,
           thousands=None,convert_float=True,converters=None)

各个参数的含义如下所示:

  • io:指定电子表格的具体路径。
  • sheetname:指定需要读取excel中的第几个Sheet,可以传递整数也可以传递具体的Sheet名称。
  • header:是否需要将数据集的第一行用作表头,默认为是需要的。
  • skiprows:读取数据时,指定需要跳过原数据集的起始行数。
  • skip_footer:读取数据时,指定需要跳过的原始数据集的末尾行数。
  • index_col:指定哪些列用作数据框的行索引(标签)。
  • names:如果原数据中没有变量,可以通过该参数在数据读取时给数据添加具体的表头。
  • parse_cols:如果参数值为True,则尝试解析数据框的行索引;如果参数为列表,则尝试解析对应的日期列;如果参数为嵌套列表,则将某些列合并为日期列;如果参数为字典,则解析对应的列(即字典中的值),并生成新的变量名(即字典中的键)。
  • parse_dates:该参数在函数内不再生效。
  • na_value:指定原始数据中哪些特殊值代表了缺失值。
  • thousands:指定原始数据集中的千分位符。
  • convert_float:默认将所有的数值型变量转换为浮点数。
  • converters:通过字典格式,为数据集中的某些变量设置转换函数。

我们需要导入如下所示的Excel文件:
Python数据分析补充:数据的读取(文本、Excel、数据库)_第2张图片

这个数据是商品的入库信息,存在一些问题:

  1. 表格没有表头,读取数据时需要考虑添加表头;
  2. 第一列为商品编号,某些商品是以0开头的,如何避免数据读入后0消失;
  3. 最后一列有一个值是未知,如何读入数据时指定这样的数据为缺失值。
import pandas as pd

data2 = pd.read_excel(io=r'C:\Users\lin-a\Desktop\【数据分析从入门到进阶】配套数据\第5章\datas\data2.xlsx',
                     header=None,
                     names=['id','date','prod_name','price','color'],
                     converters={'id':str},# 字典中的键可为我们命名的列索引“id”,也可以为默认索引“0”
                      na_values='未知' # 将原始数据中的“未知”值转换成缺失值
                     )
data2
id date prod_name price color
0 0023146 2016-03-18 连衣裙 237 白色
1 1344527 2017-06-12 牛仔裤 368 蓝色
2 0223685 2018-02-10 皮鞋 589 NaN
3 0037249 2017-07-17 寸衫 299 白色
4 0368241 2016-03-23 板鞋 299 蓝色
5 1127882 2018-09-17 西装 1599 黑色

三、数据库数据的读取

在实际工作中,数据通常是存储在数据库中,如SQL Server数据库、MySQL数据库及Oracel数据库等。在使用Python进行数据分析和挖掘时,依然可以使用Pandas模块,所不同的是需要和其他模块搭配使用:

  • 读入SQL Server数据库的数据要使用pymssql模块;
  • 读入MySQL数据库的数据要使用Pymysql模块。

以SQL Server和MySQL数据库为例,在Jupyter输入“! pip install pymssql”和“! pip install pymysql”完成pymssql和pymysql模块的导入,然后基于两个模块各自的connect函数构建数据库与Python之间的桥梁。最后在搭建好连接的基础上,使用Pandas模块中的read_sql函数实现数据库数据的读取。

1. connect函数

(1)pymssql.connect函数

pymssql.connect(server=None,user=None,password=None,database=None,charset=None)

以上参数的含义如下所示:

  • server:指定需要访问的SQL Server服务器,如果是本地数据库,则指定“localhost”,如果是远程服务器,则指定具体的IP地址;
  • user:指定访问SQL Server数据库的用户名;
  • password:指定访问SQL Server数据库的密码;
  • database:指定访问SQL Server数据库的具体库名;
  • charset:指定读取SQL Server数据库的字符集(为了防止乱码),如果数据库表中含有中文,一般可以尝试将该参数设置为“utf-8”或“gbk”。

(2)pymysql.connect函数

pymysql.connect(host=None,user=None,password='',database=None,port=0,charset='')

以上参数的含义如下所示:

  • host:指定需要访问的MySQL服务器,如果是蹦迪数据库,则指定“localhost”,如果远程服务器,则指定具体的IP地址;
  • user:指定访问MySQL数据库的用户名;
  • password:指定访问MySQL数据库的密码;
  • database:指定访问MySQL数据库的具体库名;
  • port:指定访问MySQL数据库的端口号;
  • charset:指定读取MySQL数据库的字符集(为了防止乱码),如果数据库表中含有中文,一般可以尝试将该参数设置为“utf-8”或“gbk”。

2. read函数

pd.read_sql(sql,con,index_col=None,coerce_float=True,parse_dates=None,columns=None)

以上参数的含义如下:

  • sql:指定一段字符型的SQL查询代码,用于说明数据的读取逻辑;
  • con:指定数据库与Python之间的链接桥梁;
  • index_col:指定哪些字段用作数据的索引;
  • coerce_float:bool类型的值,用于判断是否将非字符的变量强制转换为浮点型,默认为True;
  • parse_dates:指定哪些字段需要做日期类型的转换;
  • columns:指定数据中哪些字段需要读入到Python环境中。

你可能感兴趣的:(Python数据分析补充:数据的读取(文本、Excel、数据库))