Skip to main content
 首页 » 编程设计

python之加速数据导入功能(Pandas 和 append 到 DataFrame)

2025年05月04日27tintown

我们的数据输出文件夹包含数量可变的 .csv 文件,这些文件与包含所有不同记录参数的 .xml 文件相关联。每个 .csv 文件代表一个记录数据的“扫描”,所以我目前正在尝试弄清楚如何将所有这些文件组合到一个大型多索引(Sweep# 和 Time)数据帧中进行处理(因为我们通常正在查看一次扫描一整套并找到平均值)。

到目前为止,我有以下两个功能。第一个只是对数据框做了一些小的修改,以使其在以后更易于管理。

def import_pcsv(filename): 
    df = pd.read_csv(filename, skipinitialspace=True) 
    df.rename(columns = {df.columns[0]:'Time'}, inplace=True) 
    df.Time = df.Time/1000 
    df.set_index('Time', inplace=True) 
    return df 

第二个是解析文件夹的真正主力。它获取文件夹中的所有 xml 文件,解析它们(使用我放在另一个模块中的另一个函数),然后将关联的 csv 文件导入到一个大型数据框中。

def import_pfolder(folder): 
    vr_xmls = glob(folder+r'\*VoltageRecording*.xml') 
    data = pd.DataFrame() 
    counter = 1 
 
    for file in vr_xmls: 
        file_vals = pxml.parse_vr(file) 
        df = import_pcsv(folder + '\\' + file_vals['voltage recording'] + '.csv') 
        df['Sweep'] = 'Sweep' + str(counter) 
        df.set_index('Sweep', append=True, inplace=True) 
        data = data.append(df.reorder_levels(['Sweep','Time'])) 
        counter+=1 
 
    return data 

问题是如果文件夹中有大量文件,这会变得很慢。第一个函数基本上和普通的 pandas read_csv 函数一样快(慢了几毫秒,但没关系)

我对文件夹中不同数量的 csv/xml 文件对运行了一些计时测试。每个的 %time 是:

1 个文件 = 339 毫秒

5 个文件 = 2.61 秒

10 个文件 = 7.53 秒

20 个文件 = 24.7 秒

40 个文件 = 87 秒

最后一个是真正的 killer 。

为了解决这个问题,我还在 import_pfolder() 中的 for 循环的每一行上获得了一些时间统计信息——括号中的时间是 %timeit 的最佳时间

第一行 = 2 毫秒 (614us)

第二行 = 98 毫秒(82.2 毫秒)

第 3 行 = 21 毫秒(10.8 毫秒)

第 4 行 = 49 毫秒

第 5 行 = 225 毫秒

我猜速度变慢是因为每次循环都必须在最后一行复制整个数据帧。不过,我无法弄清楚如何避免这种情况。我在 .csv 文件中唯一确定的列是第一列(时间)——来自那里的文件可以有可变数量的列和行。有没有一种方法可以预先分配一个考虑到这种可变性的数据框?那会有帮助吗?

如有任何建议,我们将不胜感激。

谢谢

请您参考如下方法:

根本不要像那样 append DataFrame(也不要以空的开始),每个 append 都是一个副本。这将导致单个副本和持续的 append 性能。 Concat 文档是 here

相反:

frames = [] 
 
for f in files: 
      frames.append(process_your_file(f)) 
 
result = pd.concat(frames)