记录下之前用python3 写的一个处理Excel表格数据筛选脚本用到的一些方法。
本文内容比较杂,可按需跳转翻看。
pandas是一个内容十分丰富的库,我也只不过用到其中处理excel的方法,对这个库感兴趣的可以直接翻阅pandas官方文档,对处理excel方法部分感兴趣的可以点击这里
目录
- pandas安装
- 图形化收集文件夹和文件名
- 自动创建文件夹
- pandas读取Excel表格
- pandas筛选Excel表格数据
- pandas生成新数据表
- 结尾
pandas安装
本文所用Python环境为3.9,操作系统为Windows 10
安装pandas库
pip install pandas
本文安装完pandas库后还需安装依赖库openpyxl
pip install openpyxl
图形化收集文件夹和文件名
脚本的初衷是批量化处理数据,收集文件信息必不可少,减少文本输入是编写脚本的一个初衷,所以选择图形化界面收集文件信息
Python3 内置提供了图形化界面库tk和文件操作库os,直接导入所用到库
import pandas as pd
import os
from tkinter import *
import tkinter.filedialog
Tk()创建图形化窗口收集文件夹路径,os.listdir()收集路径下子文件名生成列表
root = Tk() # 创建图形化窗口
path = tkinter.filedialog.askdirectory() # 选择文件夹
list_filename = os.listdir(path)
也可直接收集单个文件名信息
file = tkinter.filedialog.askopenfilename() # 选择一个文件,收集到文件绝对路径
path, filename = os.path.split(file)[0], os.path.split(file)[1] # path为路径,filename为文件名
自动创建文件夹
需要对数据进行分类导出,自动创建文件夹进行分类
创建一个列表,使用os库进行文件夹创建,此处按地市来创建,将新创建的文件夹放置于原文件夹下
city = ['北海', '崇左', '防城港', '贵港', '桂林', '河池', '贺州', '来宾', '柳州', '南宁', '钦州', '梧州', '玉林', '百色']
for i in city:
path_new = path + '/分类/' + i
exists = os.path.exists(path_new)
if not exists: # 如果未创建目录
os.makedirs(path_new)
print(f'目录{path_new}已创建')
pandas读取Excel表格
将之前收集到的文件信息重新构建成绝对路径以便读取,同时使用endswith()判断文件名后缀为.xlsx,使用pandas的read_excel()进行读取
for n in list_filename:
filename = path + '/' + n
if filename.endswith('.xlsx'):
ws = pd.read_excel(filename, sheet_name=0, keep_default_na=False)
其中sheet_name=可用表名或者数字,0代表第一个表,1代表第二个表,'sheet1’代表读取sheet1表,以此推类;keep_default_na=False表示读取到空单元格时不使用NaN代替。除此外还有其他参数,请参考pandas文档
以此方式读取表格会产生columns列标签和index行索引,如图:
pandas筛选Excel表格数据
本文筛选条件为按列筛选地市数据并分类,使用str.contains()方法进行筛选
for i in city:
md = ws.loc[ws['所属地市'].str.contains(i, na=False, regex=True)]
此处na=False为遇单元格为空时不填充NaN;loc[ ]通过标签或布尔数组访问一组行和列。
contains()方法筛选较为宽松,填充内容默认为正则表达式,即regex=True,当regex=False则以字符串来进行筛选。
如下图:
所属地市:南宁 筛选出结果:
所属地市:南宁或桂林 筛选出结果:
以字符串筛选:
所属地市:除去南宁或桂林 筛选出结果:
也可换成在后面 == False,效果相同
当需要更严格筛选时,可使用str.fullmatch()
fullmatch()仅当字符串完全匹配时为真
当多重列筛选时,可以先全部收集,再使用 drop_duplicates() 进行自动去重
注意! 筛选的数据一般需要使用loc[ ] 来进行整行数据摘取
pandas生成新数据表
筛选完数据后,需要生成新数据表,本文使用 to_excel()来生成
to_excel() 指向地址若已存在同名数据表,将会对该数据表进行内容覆盖,使用时需注意
此处index=False 为不额外生成行索引,否则会在每行数据前多加一个数字索引
除此外,若没有筛选到数据,to_excel()也会生成新数据表,但仅存在列标签,若想筛选无结果不建立新表,仅需判断有无行索引
if len(wd.index.values):
wd.to_excel(path + new_filename, index=False)
print(path + new_filename + " OK")
else:
print("筛选数据为空 不创建表")
结尾
文章到这里就结束了,想了解更多pandas用法可前往pandas官方翻看pandas十分钟上手教程
如对代码如果有什么疑问可以评论或私信,觉得有用的话还可以关注收藏一手 - ’ v ’ - 十分感谢。