我试图用Python导入大型文件(..tab/..txt、300+列和1000 000+行)。该文件被分隔开。列中填充整数值。我的目标之一是对每一列进行一次求和。但是,这些文件太大,无法用pandas.read_csv()导入,因为它消耗了太多的内存。样本数据:

因此,我编写了以下代码来导入1列,执行该列的和,将结果存储在一个dataframe (= summed_cols)中,删除该列,然后继续该文件的下一列:
x=10 ###columns I'm interested in start at col 11
#empty dataframe to fill
summed_cols=pd.DataFrame(columns=["sample","read sum"])
while x<352:
x=x+1
sample_col=pd.read_csv("file.txt",sep="\t",usecols=[x])
summed_cols=summed_cols.append(pd.DataFrame({"sample":[sample_col.columns[0]],"read sum":sum(sample_col[sample_col.columns[0]])}))
del sample_col每一列代表一个示例,“读取和”是该列的和。因此,这段代码的输出是一个dataframe,在第一列中有2列,每列有一个样本,在第二列中,有相应的读和。
这段代码完成了我想做的事情,但是效率不高。对于这个大文件,大约需要1-2个小时才能完成计算。特别是只加载1列需要很长时间的安静。
我的问题是:是否有一种更快的方法,只导入这个大型选项卡文件的一列,并执行与上面代码相同的计算?
发布于 2019-06-20 12:41:10
你可以试试这样的东西:
samples = []
sums = []
with open('file.txt','r') as f:
for i,line in enumerate(f):
columns = line.strip().split('\t')[10:] #from column 10 onward
if i == 0: #supposing the sample_name is the first row of each column
samples = columns #save sample names
sums = [0 for s in samples] #init the sums to 0
else:
for n,v in enumerate(columns):
sums[n] += float(v)
result = dict(zip(samples,sums)) #{sample_name:sum, ...}我不确定这是否有效,因为我不知道输入文件的内容,但它描述了一般过程。您只打开文件一次,遍历每一行,拆分以获取列,并存储所需的数据。请注意,此代码不会处理丢失的值。
可以使用numpy改进else块:
import numpy as np
...
else:
sums = np.add(sums, map(float,columns))https://stackoverflow.com/questions/56685597
复制相似问题