Python 如何在不打开大型csv文件的情况下读取该文件,使其每行都有一个数字总和
我正在处理一个大型csv文件(>500000列x403行),我的目标是获得每行所有数字的总和,但行的第一行的前三个单元格除外,它们仅描述我的样本。我想用熊猫包 数据集如下所示: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
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