【问题标题】:How to convert multiple csv files into array faster?如何更快地将多个 csv 文件转换为数组?
【发布时间】:2021-03-02 12:04:04
【问题描述】:

我有一个包含 9000 个 CSV 文件的文件夹。每个文件有 5000 行和 12 列。出于深度学习训练的目的,我需要将整个文件(所有文件)转换为形状数组(9000,5000,12)。我在工作中使用此代码:


path=mypath+'//'+li[0]+'.csv' #li is a list containing the filenames, this is for a filtering purpose, please ignore this  
df=pd.read_csv(path)
a=np.array(df)

path=mypath+'//'+li[1]+'.csv'   
df=pd.read_csv(path)
arr=np.array(df)
a=np.stack((a,arr))
for filename in li[2:]:
    path=mypath+'//'+filename+'.csv'   
    df=pd.read_csv(path) 
    arr=np.array(df)
    if(arr.shape[0]!=4999):
        
        continue
    
    a=np.append(a,[arr],axis=0)

所以,基本上,我将每个 CSV 文件转换为一个数据框,然后将数据框转换为一个数组。最后将数组堆叠在一起。

这个过程花费了太多时间。 1 小时内仅转换了 2000 个文件。有没有更快的方法可以达到我的目的?

抱歉我的编码格式不好,我只是粗略地做,花了太多时间

【问题讨论】:

  • df.values() 将为您提供 DataFrame 内的二维(numpy)值数组。它可能比使用np.array(df) 创建一个新数组更快且内存消耗更少。
  • 追加到一个数组将每次调整该数组的大小。如果可以,请预先分配完整的(空)3D 数组,然后将具有正确索引的 2D 数组就地插入到该 3D 数组中。请注意,内存可能会成为这些数组维度的问题。
  • 9000 个带有(整数?浮点数?)数据的 CSV 文件?如果您对输入文件有任何控制权,请考虑使用适当的二进制格式,例如 HDF5。如果涉及浮点数和元数据,这将使事情快得多,而且会好得多。
  • 请注意,一小时内 2000 个文件并没有那么糟糕:一个下午在此期间做其他事情并且您的所有数据都已被读取。只需确保以正确的格式存储最终的 3D 数组(例如,前面提到的 HDF5 可以工作)。

标签: python arrays pandas csv


【解决方案1】:

终于解决了这个问题。感谢@0 0 我已经预先分配了数组,只用了 3 分钟就完成了我的工作!

os.chdir("E://2-1//reserach//tanvir sir//datasets//ECGDataDenoised//filter//")
from glob import glob
import numpy as np
strain = glob("*.csv")



arr=np.zeros(( 9061,4999,12  ))
i=0
for filename in strain:
      
    df=pd.read_csv(filename) 
    
    arr[i]=df.values
    i=i+1

数组的最终形状是 (9061,4999,12) ,如我所愿!

【讨论】:

  • 我希望你不要依赖任何特定的文件顺序和你的零维。
  • 您可以通过将9061 更改为len(strain) 使事情变得更加灵活。并使用for (i, filename) in enumerate(strain): 删除i=0i=i+1 行:往往更清楚您的意图(文件名的索引与arr 中的第一个索引匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2019-06-26
相关资源
最近更新 更多