我正在尝试将 Fastq 文件直接读入 pandas 数据帧,类似于下面的链接:
我到处搜索,但找不到可行的选择。
目前,我正在运行以下内容:
cmd = f'zcat {infile} | paste - - - -'
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
b = StringIO(p.communicate()[0].decode('utf-8'))
_ = pd.read_csv(b, sep='\t', names=['read_id', 'seq', '+', 'qual'], on_bad_lines='skip', dtype=str, chunksize=1000000)
有没有更干净的方法来只使用
pandas
来代替?我正在考虑设置 sep='\n'
,但后来我只得到 1 行多列。我可以读入文件,然后每隔 4 行创建 4 个所需的列(或类似的东西)吗?
速度确实是我所追求的,所以最快的解决方案将是最好的。
旁注:我的 Fastq 文件无法放入内存,所以我必须对读取进行分块
所以我找到了一些有用的东西(以防万一其他人想做类似的事情):
import pandas as pd
pd.DataFrame(pd.read_csv(<infile>, sep='\n', header=None).values.reshape(-1, 4), columns=['read_id', 'seq', '+', 'qual'])
想法来自:
(感谢@piRSquared的建议)
我用过这个,这个有效:
将 pandas 导入为 pd
pd.DataFrame(pd.read_csv(, sep=' ', header=None).values.reshape(-1, 4), columns=['read_id', 'seq', '+', 'qual'])