python - 循环遍历熊猫数据框的更有效方法是什么?
问题描述
我需要从 37,000 个 xls 文件中提取一些数据,这些文件存储在 2100 个文件夹(活动/年/月/日)中。我已经编写了脚本,但是当给出一千个文件的小样本时,运行需要 5 分钟。每个单独的文件最多可以包含我需要提取的一万个条目。没有尝试在整个文件夹上运行它,我正在寻找如何提高效率的建议。
我还想要一些有关如何将字典导出到新的 excel 文件、两列或如何跳过整个字典并直接保存到 xls 以及如何将整个脚本指向共享驱动器文件夹而不是Python 的根。
import fnmatch
import os
import pandas as pd
docid = []
CoCo = []
for root, dirs, files in os.walk('Z_Option'):
for filename in files:
if fnmatch.fnmatch(filename, 'Z_*.xls'):
df = pd.read_excel(os.path.join(root, filename), sheet_name='Sheet0')
for i in df['BLDAT']:
if isinstance(i, int):
docid.append(i)
CoCo.append(df['BUKRS'].iloc[1])
data = dict(zip(docid, CoCo))
print(data)
解决方案
当我开始使用 pandas 时,这个演练对我很有帮助。可能需要这么长时间的是这for i in df['BLDAT']
条线。
使用类似 apply 函数的东西可以提高速度:
def check_if_int(row): #row is effectively a pd.Series of the index
if type(row['BLDAT']) == 'int':
docid.append(i)
CoCo.append(row.name) #name should be the index
df.apply(check_if_int, axis = 1) #axis = 1 will work rowwise
目前还不清楚这个脚本到底想做什么,但如果它像过滤数据帧一样简单,只包含'BLDAT'
列是整数的行,那么使用掩码会快得多
df_filtered = df.loc[type(df['BLDAT']) == 'int'] #could also use .isinstance()
与创建列表相比,过滤数据框的另一个优点是能够使用 pandas 函数df_filtered.to_csv()
将文件输出为 .xlsx 兼容文件。
推荐阅读
- android - 当我开始一个新项目时,插件 Android 支持中的异常
- php - Laravel 集合问题
- python - 在 Windows 上安装“pip”时遇到问题
- generics - 自定义边缘供应商错误:如何编写通用方法?
- javascript - *ngFor 内的角度 [(ngModel)]
- reactjs - 我在需要测试的非组件 React 文件中有一行代码不会被测试击中
- amazon-web-services - 如何高效、低成本地更新存储在 S3 存储桶中的文件数据?
- reach-router - 使用到达路由器路由到外部链路
- javascript - 事件如何冒泡到文档而不是 document.body?
- scala - Spark Scala:比较两个字符串中的单词的有效方法