在dask数据帧中使用行号作为索引来过滤具有块大小和行集的输入文件

时间:2019-10-03 19:38:52

标签: dask

我有大约70gb的MD模拟输出。在文件中定期重复行数固定说明的模式和行数固定数据。如何在Dask Dataframe中逐块读取文件,忽略解释行?

我成功地在pandas.read_csv的skiprows参数中编写了一个lambda函数,以忽略解释行,而仅读取数据行。我将输入的熊猫代码转换为简单的代码,但是它不起作用。在这里,您可以看到用dd.read_csv替换pandas.read_csv编写的简洁代码:

# First extracting number of atoms and hence, number of data lines:
with open(filename[0],mode='r') as file: # The same as Chanil's code
    line = file.readline()
    line = file.readline() 
    line = file.readline()
    line = file.readline() # natoms
    natoms = int(line)

skiplines = 9 # Number of explanation lines repeating after nnatoms lines of data

def logic_for_chunk(index):
    """This function read a chunk """
    if index % (natoms+skiplines) > 8:
       return False
    return True
df_chunk = dd.read_csv('trajectory.txt',sep=' ',header=None,index_col=False,skiprows=lambda x: logic_for_chunk(x),chunksize=natoms)

这里数据帧的索引是文件的行号。使用上面的代码,在第一个块中,将忽略文件中的第0至8行,然后读取第9至58行。在下一个块中,将忽略第59至67行,然后读取第68至117行的natoms大小的块。直到读取所有数据快照后,这种情况才会发生。 不幸的是,尽管上面的代码在熊猫中很好用,但在dask中却行不通。如何在dask数据框中实现类似的过程?

1 个答案:

答案 0 :(得分:0)

dask数据框read_csv函数在字节位置剪切文件。无法确切确定每个分区中有多少行,因此依赖每个分区中的行索引是不明智的。

如果还有其他方法可以检测到不良线路,那么我会尝试这样做。理想情况下,您将能够根据行的内容而不是其在文件中的位置(如每八行)来确定错误的行。