首页 > 解决方案 > 循环遍历熊猫数据框的更有效方法是什么?

问题描述

我需要从 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)

标签: python

解决方案


当我开始使用 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 兼容文件。


推荐阅读