根据要处理的数据量的大小,以及所使用的工具的不同,有不同的数据导入或输入方法。本节主要介绍用对象模型导入数据和用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。
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个工作表中的数据。
>>> = 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参数指定某列作为行索引。下面同时打开前两个工作表,指定“工号”列作为行索引,在脚本中添加下面的语句行:
df2=pd.read_excel(io='D:\身份证号.xlsx',sheet_name=[0,1],\
index_col='工号',engine='openpyxl')
print(df2)
运行脚本,在Python Shell窗口输出前2个工作表中的数据。
>>> = 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方法垂向拼接两个工作表的数据。在脚本中添加下面的语句行:
df3=df2[0] #第1个工作表的数据
df4=df2[1] #第2个工作表的数据
df5=pd.concat([df3,df4]) #拼接两个工作表的数据
print(df5) #输出数据
运行脚本,在Python Shell窗口输出拼接后的数据。
>>> = 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文件中。在脚本中添加下面的语句行:
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。
import pandas as pd
import os
root = os.getcwd()
df=pd.read_csv(root+r'\身份证号.csv',encoding='gbk')
print(df)
运行脚本,在Python Shell窗口输出第1个工作表中的数据。
>>> = 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数据中提取女性工作人员的信息数据。
df2=df[df['性别']=='女']
print(df2)
运行脚本,在Python Shell窗口输出女性工作人员的信息数据。
>>> = 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文件中。在脚本中添加下面的语句行:
df2.to_csv(root+r'\new_file.csv',encoding='gbk')
运行脚本,数据被正确保存到指定文件中。[大谦Excel,dqexcel点com]