【问题标题】:Python Fast data import column-widePython 快速数据导入列范围
【发布时间】:2023-04-09 11:21:02
【问题描述】:

我正在使用以下代码从 500 个*.txt 文件中导入 3 列中的 2 列(触发器和幅度):

    from glob import glob
    import pandas

    dataFileList = glob( '*.txt' )
    nbDataSamplesFiles = len(dataFileList)
    amplitudes = []
    colnames = ['time','trigger','amplitude']
    for dataFileName in dataFileList :
        #Method4
        data = pandas.read_csv( dataFileName, delim_whitespace=True, skipinitialspace=True, names = colnames ) #Environ 4.5s pour 500 fichiers
        trigger1 = data['trigger'].tolist()
        amplitude1 = data.amplitude.tolist() #another way
        amplitudes.append( amplitude1 ) #list of lists

    amplitudes = np.asarray( amplitudes ) #matrix nbFiles x nbSamples

完成这项工作大约需要 3.5 秒。

我需要它更快,有没有办法使用相同或另一个 python 模块来做到这一点?

我该如何实现呢?

更新 1:使用dask

import dask.dataframe as dd

amplitudes = []
for dataFileName in dataFileList :
    df = dd.read_csv(urlpath = dataFileName, delim_whitespace=True, skipinitialspace=True, names = colnames )
    trigger1 = df.trigger.values
    amplitude1 = df.amplitude.values
    amplitudes.append( amplitude1 ) #list of arrays

我想查看幅值1的内容:

ipdb> amplitude1[111:121]
*** ValueError: ('Arrays chunk sizes are unknown: %s', (nan,))

有什么想法吗?

【问题讨论】:

  • colnames 在循环期间不会更改。为什么不把它放在循环之外——不确定在 python 中做了哪些优化,但它有可能使事情(稍微)更快。
  • @KolaB 我把它放在循环之外并没有得到太多,事实上我没有区别,但无论如何都很好
  • 在这种情况下,最好将它放回循环中 - 保持在使用它的范围内?我猜口译员正在进行必要的优化......
  • 您能否将数据转换为另一种格式,例如 Parquet? matthewrocklin.com/blog/work/2017/06/28/use-parquet
  • @MRocklin 嗨,我还不知道。我们的人正在使用picoscope,但我不知道他们是如何获取数据的。他们只是把数据文件交给我

标签: python pandas import dask


【解决方案1】:

Dask 可能是尝试处理大型 CSV 集合/目录的好选择 - 浏览 Dask Docs - Specific Usecase

【讨论】:

  • 尝试此操作时:df = dd.read_csv( dataFileName, delim_whitespace=True, skipinitialspace=True, names = colnames ); df['trigger'].tolist() 我收到以下错误:AttributeError: 'Series' object has no attribute 'tolist'
  • 您正在尝试使用 pandas.read_csv 的参数而不是 dask.dataframe.read_csv(代码中的“dd.read_csv”)。参考dask.dataframe.read_csv-dask.pydata.org/en/latest/dataframe-api.html的参数
  • @Ok 正确的行是df = dd.read_csv(urlpath = dataFileName, delim_whitespace=True, skipinitialspace=True, names = colnames ),但我仍然无法获取我的数据:trigger1 = list( df.trigger )NotImplementedError
  • 你能分享你现在为 dask 实现的代码的 sn-p 吗?
  • 由于在 cmets 中不能使用多行代码,我只是编辑问题的结尾,请在此处找到新的实现
猜你喜欢
  • 1970-01-01
  • 2011-03-07
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多