首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有什么方法比熊猫000+ ()更有效地加载包含1000个000+行的1列?

有什么方法比熊猫000+ ()更有效地加载包含1000个000+行的1列?
EN

Stack Overflow用户
提问于 2019-06-20 12:04:25
回答 1查看 134关注 0票数 0

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

因此,我编写了以下代码来导入1列,执行该列的和,将结果存储在一个dataframe (= summed_cols)中,删除该列,然后继续该文件的下一列:

代码语言:javascript
运行
复制
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列需要很长时间的安静。

我的问题是:是否有一种更快的方法,只导入这个大型选项卡文件的一列,并执行与上面代码相同的计算?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-20 12:41:10

你可以试试这样的东西:

代码语言:javascript
运行
复制
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块:

代码语言:javascript
运行
复制
import numpy as np
...
else:
    sums = np.add(sums, map(float,columns))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56685597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档