数据的导入或输入

根据要处理的数据量的大小,以及所使用的工具的不同,有不同的数据导入或输入方法。本节主要介绍用对象模型导入数据和用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  财务部  陈东  5103211978100300161002  财务部  田菊  4128231980052510081003  生产部  王伟  4302251980031130241004  生产部  韦龙  4302251985111630081005  销售部  刘洋  430225198008123008  女, 1:        部门   姓名                身份证号 性别
工号
1006  生产部   吕川  3203251970010170241007  销售部   杨莉  4201171973021749761008  财务部   夏东  1328011947050580001009  销售部   吴晓  4302251980011530241010  销售部  宋恩龙  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  财务部   陈东  5103211978100300161002  财务部   田菊  4128231980052510081003  生产部   王伟  4302251980031130241004  生产部   韦龙  4302251985111630081005  销售部   刘洋  4302251980081230081006  生产部   吕川  3203251970010170241007  销售部   杨莉  4201171973021749761008  财务部   夏东  1328011947050580001009  销售部   吴晓  4302251980011530241010  销售部  宋恩龙  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]