Python 帮同事用pandas快速筛选Excel文件

简介: Python 帮同事用pandas快速筛选Excel文件

同事正在为怎样处理一个18万行的全年财务Excel文件发愁,文件足足有30M,打开文件也要两三分钟,于是他就向我求助。大概意思就是要筛选出Data工作簿“源数据”Sheet中所有收款人对应的付款人及付款笔数、金额小计,于是我简化做了一个表格,只有4个涉及到的列,随机数据200行用于测试。其实我也没好好学过pandas库的用法,只能边写代码边查库函数方法的帮助。


读者想测试的话把以下表格建一个Data.xlsx文件,放入工作表sheet改名为“源数据”:


image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png



程序执行后,输出的output.xlsx文件格式:

image.pngimage.pngimage.png

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png



源代码20行(其中有6行是测试用时的代码可以去除)如下:

import time, pandas as pd
def tprint(info): print(info); return time.time()
t1 = tprint('正在读取数据,请稍候...')
df = pd.read_excel('data.xlsx', sheet_name='源数据')
t2 = tprint('正在数据计算,请稍候...')
ls, label = [], ('付款人','收款人','摘要','金额','笔数','总笔数','全部摘要')
for 收款人 in df.收款人.unique():
    付款人 = df[df.收款人==收款人].付款人
    总笔数 = 付款人.shape[0]
    for 付款人 in 付款人.unique():
        数集 = df[(df.收款人==收款人) & (df.付款人==付款人)].fillna('空值')
        笔数, 金额 = 数集.shape[0], 数集.金额.sum().round(2)
        摘要,全部摘要 = 数集.摘要.iloc()[0], "、".join(数集.摘要.unique())
        ls.append('~'.join(map(str,(eval(_) for _ in label))).split("~"))
data = pd.DataFrame(ls, columns=label).sort_values(by='收款人')
data.金额, data.笔数, data.总笔数 = data.金额.astype('float'),data.笔数.astype('int'),data.总笔数.astype('int')
t3 = tprint('正在写入文件,请稍候...')
data.to_excel('output1.xlsx', sheet_name='Sheet1',index=False)
t4 = time.time()
print(f'读取耗时:{t2-t1:.3f}s\n计算耗时:{t3-t2:.3f}s\n写入耗时:{t4-t3:.3f}s\n共计耗时:{t4-t1:.3f}s')



测试效果:


   正在读取数据,请稍候...

   正在数据计算,请稍候...

   正在写入文件,请稍候...

   读取耗时:0.859s

   计算耗时:0.314s

   写入耗时:0.063s

   共计耗时:1.236s


处理那个30M的文件时,因为列名一样,都不用改代码。实测读取用了58秒,计算用1600秒,共计用时28分钟左右,完美完成筛选任务。


边学边写的代码,可能就根本没用到pandas的精华所在。但也谈谈代码中几个注意点:


1. python 支持中文名变量,直接用列名作变量有好处,省得注释以及想很多变量名称来命名。


2. DataFrame筛选条件的逻辑运算用 & | ,其运算级别高于“大于”“小于”“等于”等,所以括号不能省。如代码中的: df[(df.收款人==收款人) & (df.付款人==付款人)]


3. 取DataFrame的列,可以用 df['收款人'] 也能用 df.收款人,我觉得用后者更方便点。


4. 源数据“摘要”列中有空单元格,读入DataFrame中后其值为nan,这个起先没注意到代码一直报错。后查询到df有.fillna()方法可以替换掉空值。


5. 求行数可以直接用len(df)求,也可用df.shape()方法返回一个元组:(行数、列数)。


6. 行数据我用了一句代码 '~'.join(map(str,(eval(_) for _ in label))).split("~") 合并后分割成列表。意思是从元组中取数eval转成变量,再把当层循环的变量值转字符型合并最后分割,字符“~”任意取其它字符来替代,但不能在数据中出现过否则分割列数不正常。


7. 数值类型的列都要用.astype()转回相应的数值类型,否则得到的.xlsx文件中数值列都是文本型数字(Excel中表现为单元格左上角有绿色小三角),不便于统计合计数。如:

data.金额 = data.金额.astype('float')
   data.笔数 = data.笔数.astype('int')



8. df.unique()是去重方法,相当于用set()给列表去重;df.sort_values(by='',acending=True)是排序方法,升序或降序scending=True表示升序,ascending=False表示降序,默认为升序。


(本文完)


附pandas学习图一张:

c5b4ec8085ff4e11a7929de35d1852bf.png





目录
相关文章
|
6月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
495 0
|
6月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
670 0
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
516 7
|
8月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
677 0
|
存储 数据挖掘 数据处理
Pandas 数据筛选:条件过滤
Pandas 是 Python 最常用的数据分析库之一,提供了强大的数据结构和工具。本文从基础到高级,介绍如何使用 Pandas 进行条件过滤,包括单一条件、多个条件过滤、常见问题及解决方案,以及动态和复杂条件过滤的高级用法。希望本文能帮助你更好地利用 Pandas 处理数据。
1360 78
|
存储 数据挖掘 数据处理
pandas 读取xlsx文件复制文件
Pandas 提供了强大的功能来读取和处理 Excel 文件,通过结合使用 `read_excel` 和 `to_excel` 方法,可以轻松地对 Excel 文件进行读取、处理和复制。无论是处理单个工作表还是多个工作表,Pandas 都能高效地完成任务。
420 11
|
Python
python pandas学习(一)
该代码段展示了四个主要操作:1) 删除指定列名,如商品id;2) 使用正则表达式模糊匹配并删除列,例如匹配订单商品名称1的列;3) 将毫秒级时间戳转换为带有时区调整的日期时间格式,并增加8小时以适应本地时区;4) 将列表转换为DataFrame后保存为Excel文件,文件路径和名称根据变量拼接而成。
232 3
|
SQL 存储 数据挖掘
使用Python和PDFPlumber进行简历筛选:以SQL技能为例
本文介绍了一种使用Python和`pdfplumber`库自动筛选简历的方法,特别是针对包含“SQL”技能的简历。通过环境准备、代码解析等步骤,实现从指定文件夹中筛选出含有“SQL”关键词的简历,并将其移动到新的文件夹中,提高招聘效率。
487 8
使用Python和PDFPlumber进行简历筛选:以SQL技能为例
|
存储 数据挖掘 数据处理
Python Pandas入门:行与列快速上手与优化技巧
Pandas是Python中强大的数据分析库,广泛应用于数据科学和数据分析领域。本文为初学者介绍Pandas的基本操作,包括安装、创建DataFrame、行与列的操作及优化技巧。通过实例讲解如何选择、添加、删除行与列,并提供链式操作、向量化处理、索引优化等高效使用Pandas的建议,帮助用户在实际工作中更便捷地处理数据。
481 2
|
数据可视化 数据处理 Python
使用Pandas实现Excel中的数据透视表功能
本文介绍了如何使用Python的Pandas库实现Excel中的数据透视表功能,包括环境准备、创建模拟销售数据、代码实现及输出等步骤。通过具体示例展示了按地区和销售员汇总销售额的不同方法,如求和、平均值、最大值等,帮助读者掌握Pandas在数据处理上的强大能力。
591 12

推荐镜像

更多