【发布时间】:2019-06-20 12:04:25
【问题描述】:
我正在尝试在 Python 中导入大文件(.tab/.txt、300 多列和 1 000 000 多行)。该文件是制表符分隔的。这些列用整数值填充。我的目标之一是对每一列求和。但是,文件太大而无法使用 pandas.read_csv() 导入,因为它消耗了太多 RAM。
样本数据:
因此,我编写了以下代码来导入 1 列,对该列进行求和,将结果存储在数据框 (= 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
每一列代表一个样本,“读取总和”是该列的总和。所以这段代码的输出是一个有 2 列的数据帧,第一列每行一个样本,第二列是相应的读取总和。
这段代码完全符合我的要求,但是效率不高。对于这个大文件,完成计算大约需要 1-2 小时。尤其是仅加载 1 列需要很长时间。
我的问题:有没有更快的方法来导入这个大标签文件的一列,并执行与上面代码相同的计算?
【问题讨论】:
-
为什么不用pandas内置求和函数
-
我不确定它是否会更快,但是如果你只需要列 sum 用 python 逐行读取文件并累加总和会不会更容易?跨度>
-
@Robvh 数据框的内置函数会比求和函数 sample_cols['amount'].sum() 快得多
-
@Robvh 我认为这里的问题是 OP 正在打开文件并在每次迭代时生成一个 DataFrame。确实,
sum()内置的 pandas 速度更快。但在这种情况下,它并没有多大帮助。代码需要彻底重新设计。