数据的导入或输入

根据要处理的数据量的大小,以及所使用的工具的不同,有不同的数据导入或输入方法。本节主要介绍用对象模型导入数据和用pandas导入数据的方法。[大谦Excel,dqexcel点com]

使用对象模型导入数据

数据量不大时,可以将数据导入到Excel工作表,然后用Excel, Excel函数、Excel VBA或Python xlwings等工具进行数据处理和分析。

1.3.1小节介绍了使用工作簿对象的Open方法打开已有Excel文件,请参阅。

使用Power Query和pandas导入数据

Excel的Power Query和Python的pandas包都是为大型数据的数据清洗而生的,使用它们,可以轻松处理数百万行的数据。而Excel和VBA只能处理几十万行数据。关于Power Query的处理方法,请参见相关图书和资料,这里重点介绍如何用pandas导入数据。

一、读写Excel文件

利用pandas包的read_excel方法读取Excel数据。该方法的参数比较多,常用的参数如表9-1中所示。利用这些参数,可以导入规整数据,也可以处理很多不规范的Excel数据。导入后的数据为DataFrame类型的数据。

表9-1 read_excel方法的部分参数

参 数 说 明
io Excel文件的路径和名称
sheet_name 读取数据的工作表的名称,可以指定名称,也可以指定索引号,不指定时读取第1个工作表
header 指定用哪行数据作为索引行,如果是多层索引,用多行的行号组成列表进行指定
index_col 指定用哪列数据作为索引列,如果是多层索引,用多列的列号或名称组成列表进行指定
usecols 如果只需要导入原始数据中的部分列数据,使用该参数用列表进行指定
dtype 用字典指定特定列的数据类型,如{"A":np.float64 }指定A列的数据类型为64位浮点型
nrows 指定需要读取的行数
skiprows 指定读入时忽略前面多少行
skip_footer 指定读入时忽略后面多少行
names 用列表指定列的列索引标签
engine 执行数据导入的引擎,如"xlrd", "openpyxl"等

注意:使用read_excel方法导入数据时有时会出现类似没有安装xlrd的错误以及其他各种错误。建议安装openpyxl,在使用read_excel方法时指定engine参数的值为"openpyxl"。

安装openpyxl,首先在Windows菜单中的“附件”子菜单中单击“命令提示符”选项,打开DOS命令窗口,在提示符后面输入:

pip install openpyxl

回车即可进行安装。安装成功后显示类似Finished processing dependencies for openpyxl的提示。

下面的Python脚本文件用pandas打开当前路径下的Excel文件“身份证号.xlsx”,该文件工作簿中有2个工作表,保存的是部分工作人员的身份信息。使用pandas包的read_excel方法导入该文件中第1个工作表中的数据。脚本文件的存放路径为Samples\ch21\Python\身份证号.py。

code.python
import pandas as pd  #导入pandas
import os  #导入os
root = os.getcwd()  #获取当前路径
#读取指定文件中的数据
df=pd.read_excel(io=root+r'\身份证号.xlsx',engine='openpyxl')
print(df)  #输出数据

运行脚本,在Python Shell窗口输出第1个工作表中的数据。

code.python
>>> = RESTART: …/基础篇/Samples/ch21/Python/身份证号.py
     工号   部门  姓名                身份证号 性别
0  1001  财务部  陈东  5103211978100300**  女
1  1002  财务部  田菊  4128231980052512**  男
2  1003  生产部  王伟  4302251980031135**  男
3  1004  生产部  韦龙  4302251985111635**  女
4  1005  销售部  刘洋  4302251980081235**  女

默认时将第1行数据作为表头,即列索引标签。行索引从0开始自动对行进行编号。

使用sheet_name参数可以指定打开某一个或多个工作表,用index_col参数指定某列作为行索引。下面同时打开前两个工作表,指定“工号”列作为行索引,在脚本中添加下面的语句行:

code.python
df2=pd.read_excel(io='D:\身份证号.xlsx',sheet_name=[0,1],\
                  index_col='工号',engine='openpyxl')
print(df2)

运行脚本,在Python Shell窗口输出前2个工作表中的数据。

code.python
>>> = RESTART: …/基础篇/Samples/ch21/Python/身份证号.py
{0:        部门  姓名                身份证号 性别
工号
1001  财务部  陈东  510321197810030016  女
1002  财务部  田菊  412823198005251008  男
1003  生产部  王伟  430225198003113024  男
1004  生产部  韦龙  430225198511163008  女
1005  销售部  刘洋  430225198008123008  女, 1:        部门   姓名                身份证号 性别
工号
1006  生产部   吕川  320325197001017024  女
1007  销售部   杨莉  420117197302174976  男
1008  财务部   夏东  132801194705058000  女
1009  销售部   吴晓  430225198001153024  男
1010  销售部  宋恩龙  320325198001017984  女}

现在同时导入了两个工作表中的数据,并且将“工号”列数据用作行索引。可见,此时返回的结果为字典类型,字典中键值对的键为工作表的索引号,值为工作表的数据,为DataFrame类型。

使用DataFrame对象的to_excel方法将pandas数据写入到Excel文件。比如上面导入了前两个工作表的数据,现在希望将这两个工作表的数据合并后保存到另外一个Excel文件中。使用pandas包的concat方法垂向拼接两个工作表的数据。在脚本中添加下面的语句行:

code.python
df3=df2[0]  #第1个工作表的数据
df4=df2[1]  #第2个工作表的数据
df5=pd.concat([df3,df4])  #拼接两个工作表的数据
print(df5) #输出数据

运行脚本,在Python Shell窗口输出拼接后的数据。

code.python
>>> = RESTART: …/基础篇/Samples/ch21/Python/身份证号.py
       部门   姓名                身份证号 性别
工号
1001  财务部   陈东  510321197810030016  女
1002  财务部   田菊  412823198005251008  男
1003  生产部   王伟  430225198003113024  男
1004  生产部   韦龙  430225198511163008  女
1005  销售部   刘洋  430225198008123008  女
1006  生产部   吕川  320325197001017024  女
1007  销售部   杨莉  420117197302174976  男
1008  财务部   夏东  132801194705058000  女
1009  销售部   吴晓  430225198001153024  男
1010  销售部  宋恩龙  320325198001017984  女

将合并后的数据保存到当前路径下的new_file.xlsx文件中。在脚本中添加下面的语句行:

code.python
df5.to_excel(root+r'\new_file.xlsx')

运行脚本,合并后的数据被正确保存到指定文件中。

二、读写CSV文件

CSV格式是目前最常用的数据保存格式之一,使用pandas包的read_csv方法读取CSV文件数据。该方法的常用参数如表9-2中所示。

表9-2 read_csv方法的部分参数

参 数 说 明
filepath Excel文件的路径和名称
sep 指定分隔符,默认时使用逗号作为分隔符
header 指定用哪行数据作为索引行,如果是多层索引,用多行的行号组成列表进行指定
index_col 指定用哪列数据作为索引列,如果是多层索引,用多列的列号或名称组成列表进行指定
usecols 如果只需要导入原始数据中的部分列数据,使用该参数用列表进行指定
dtype 用字典指定特定列的数据类型,如{"A":np.float64 }指定A列的数据类型为64位浮点型
prefix 在没有列标签时,给列添加前缀,例如,添加"Col"称为Col0, Col1, Col2等
skiprows 指定读入时忽略前面多少行
skipfooter 指定读入时忽略后面多少行
nrows 指定需要读取的行数
names 用列表指定列的列索引标签
encoding 指定编码方式,默认时为UTF-8,还可以指定为gbk等

下面的Python脚本文件用pandas打开当前路径下的Excel文件“身份证号.csv”。使用pandas包的read_csv方法导入该文件中第1个工作表中的数据。脚本文件的存放路径为Samples\ch21\Python\身份证号2.py。

code.python
import pandas as pd
import os
root = os.getcwd()
df=pd.read_csv(root+r'\身份证号.csv',encoding='gbk')
print(df)

运行脚本,在Python Shell窗口输出第1个工作表中的数据。

code.python
>>> = RESTART: …\基础篇\Samples\ch21\Python\身份证号2.py
     工号   部门   姓名                身份证号 性别
0  1001  财务部   陈东  5103211978100300**  女
1  1002  财务部   田菊  4128231980052512**  男
2  1003  生产部   王伟  4302251980031135**  男
3  1004  生产部   韦龙  4302251985111635**  女
4  1005  销售部   刘洋  4302251980081235**  女
5  1006  生产部   吕川  3203251970010171**  女
6  1007  销售部   杨莉  4201171973021753**  男
7  1008  财务部   夏东  1328011947050583**  女
8  1009  销售部   吴晓  4302251980011535**  男
9  1010  销售部  宋恩龙  3203251980010181**  女

用DataFrame对象的to_csv方法将pandas数据保存到CSV文件。在脚本中添加下面的语句行,从df数据中提取女性工作人员的信息数据。

code.python
df2=df[df['性别']=='女']
print(df2)

运行脚本,在Python Shell窗口输出女性工作人员的信息数据。

code.python
>>> = RESTART: …\基础篇\Samples\ch21\Python\身份证号2.py
     工号   部门   姓名                身份证号 性别
0  1001  财务部   陈东  5103211978100300**  女
3  1004  生产部   韦龙  4302251985111635**  女
4  1005  销售部   刘洋  4302251980081235**  女
5  1006  生产部   吕川  3203251970010171**  女
7  1008  财务部   夏东  1328011947050583**  女
9  1010  销售部  宋恩龙  3203251980010181**  女

将女性工作人员的信息数据保存到当前目录下的new_file.csv文件中。在脚本中添加下面的语句行:

code.python
df2.to_csv(root+r'\new_file.csv',encoding='gbk')

运行脚本,数据被正确保存到指定文件中。[大谦Excel,dqexcel点com]