Python 如何在不打开大型csv文件的情况下读取该文件,使其每行都有一个数字总和

Python 如何在不打开大型csv文件的情况下读取该文件,使其每行都有一个数字总和,python,pandas,sum,Python,Pandas,Sum,我正在处理一个大型csv文件(>500000列x403行),我的目标是获得每行所有数字的总和,但行的第一行的前三个单元格除外,它们仅描述我的样本。我想用熊猫包 数据集如下所示: label Group numOtus Otu0000001 Otu0000002 Otu0000003 Otu0000004 ... Otu0518246 sum 00.03 1.118234 518246 0 62 275 0

我正在处理一个大型csv文件(>500000列x403行),我的目标是获得每行所有数字的总和,但行的第一行的前三个单元格除外,它们仅描述我的样本。我想用熊猫包

数据集如下所示:

label   Group     numOtus   Otu0000001  Otu0000002  Otu0000003  Otu0000004  ... Otu0518246  sum
00.03   1.118234  518246    0           62          275         0           ... 5            ?
我试过几种不同的方法,但没有一种有效

我不能简单地使用从pandas读取csv然后使用它,因为文件太大(4GB)。所以,我尝试了一个for循环,一次打开一行,但是我没有得到我所期望的。最终输出应该是一列,每行的总和。 有什么想法吗

lst = []
for line in range(4033):
    l = pd.read_csv("doc.csv", sep = "\t", nrows=1, low_memory=false)
    l = l.drop(columns=['label', 'Group', "numOtus"])
    x = l[list(l.columns)].sum(axis=1, numeric_only=float)
    lst.append(x)
您可以使用,它是专门为此而构建的

import dask.dataframe as dd

dd.read_csv("doc.csv", sep = "\t").sum().compute()
您可以使用,它是专门为此而构建的

import dask.dataframe as dd

dd.read_csv("doc.csv", sep = "\t").sum().compute()

除了dask之外的另一个解决方案是在
pd.read\u csv
中使用
chunksize
参数,然后
pd.concat
您的块。 一个简单的例子:

chunksize=1000
l=pd.read\u csv('doc.csv',chunksize=chunksize,iterator=True)
df=pd.concat(l,忽略索引=True)
补充: 要逐个处理块,您可以使用:

chunksize=1000
对于pd.read\u csv('doc.csv',chunksize=chunksize,iterator=True)中的块:
#用单独的卡盘做点什么
<> P>查看您可以考虑使用TQDM的进度。

从TQM导入TQM
chunksize=1000
对于tqdm中的块(pd.read_csv('doc.csv',chunksize=chunksize,iterator=True)):
#用单独的卡盘做点什么

除了dask之外,另一种解决方案是在
pd.read\u csv
中使用
chunksize
参数,然后
pd.concat
您的块。 一个简单的例子:

chunksize=1000
l=pd.read\u csv('doc.csv',chunksize=chunksize,iterator=True)
df=pd.concat(l,忽略索引=True)
补充: 要逐个处理块,您可以使用:

chunksize=1000
对于pd.read\u csv('doc.csv',chunksize=chunksize,iterator=True)中的块:
#用单独的卡盘做点什么
<> P>查看您可以考虑使用TQDM的进度。

从TQM导入TQM
chunksize=1000
对于tqdm中的块(pd.read_csv('doc.csv',chunksize=chunksize,iterator=True)):
#用单独的卡盘做点什么

u可以使用
pandas.Series.append
pandas.DataFrame.sum
以及
pandas.DataFrame.iloc
,同时读取数据块

row_sum = pd.Series([])
for chunk in pd.read_csv('doc.csv',sep = "\t" ,chunksize=50000):
    row_sum = row_sum.append(chunk.iloc[:,3:].sum(axis = 1, skipna = True))

您可以使用
pandas.Series.append
pandas.DataFrame.sum
以及
pandas.DataFrame.iloc
,同时读取数据块

row_sum = pd.Series([])
for chunk in pd.read_csv('doc.csv',sep = "\t" ,chunksize=50000):
    row_sum = row_sum.append(chunk.iloc[:,3:].sum(axis = 1, skipna = True))


谢谢我不知道达斯克的事。但是,我得到了以下错误:ValueError:Sample不够大,无法包含至少一行数据。请在调用
read_csv
/
read_table
时增加
sample
中的字节数。您是否尝试增加
sample
,例如,使用
sample=1e9
调用它?@SandraSilva抱歉,我的错,我的意思是
sample=10**9
谢谢!我不知道达斯克的事。但是,我得到了以下错误:ValueError:Sample不够大,无法包含至少一行数据。请在调用
read_csv
/
read_table
时增加
sample
中的字节数。您是否尝试增加
sample
,例如,使用
sample=1e9
调用它?@SandraSilva抱歉,我的错误,我的意思是
sample=10**9
我认为他们应该在连接之前计算num,不是吗?否则我看不出他们是如何避免记忆错误的problem@PeterLeéh我正在尝试这种方法,但时间太长了。即使我使用%timeit来预测需要多少时间,代码也不会完成运行。知道我能做什么吗?
%timeit
不是用于预测的,它将多次运行该函数。正如我在您的问题中看到的,问题在于
chucksize
参数指定了每个块的行数。真正的瓶颈是您有超过500k列,只有4033行。尝试将chunksize降低到500-1000左右甚至更低。@SandraSilva我再次更新了答案。通过添加tqdm可以得到什么输出?那么您应该等待最终输出。我认为他们应该在连接之前计算num,不是吗?否则我看不出他们是如何避免记忆错误的problem@PeterLeéh我正在尝试这种方法,但时间太长了。即使我使用%timeit来预测需要多少时间,代码也不会完成运行。知道我能做什么吗?
%timeit
不是用于预测的,它将多次运行该函数。正如我在您的问题中看到的,问题在于
chucksize
参数指定了每个块的行数。真正的瓶颈是您有超过500k列,只有4033行。尝试将chunksize降低到500-1000左右甚至更低。@SandraSilva我再次更新了答案。通过添加tqdm可以得到什么输出?那么您应该等待最终输出。您的代码只读取第一行4033次,您的代码只读取第一行4033次,当我开始运行代码时,它永远不会结束。即使是%的时间,它也无法完成运行。你知道我能做什么吗?你能为pd中的chunk运行代码
I=0
。read\u csv('doc.csv',sep=“\t”,chunksize=50000):
print(I)
I+=1
当我开始运行代码时,它永远不会结束。即使是%的时间,它也无法完成运行。你知道我能做些什么吗?你能为pd中的chunk运行代码
I=0
。read\u csv('doc.csv',sep=“\t”,chunksize=50000):
打印(I)
I+=1