csv 通过块大小使用迭代器重构pandas

t5zmwmid  于 2023-05-11  发布在  其他
关注(0)|答案(2)|浏览(94)

我正在寻找关于使用pandas迭代器的建议。
我用Python pandas执行了一个解析操作,输入文件的大小(一个叫eggNOG的生物信息学程序)导致了“RAM瓶颈”现象。只是没有处理文件。
显而易见的解决方案是转换为迭代器,对于pandas,它是chunksize选项

import pandas as pd
import numpy as np

df = pd.read_csv('myinfile.csv', sep="\t", chunksize=100)

与原始代码不同的是chunksize=100位,强制使用迭代器。
下一步就是执行一个简单的操作,删除几列并将所有'-'字符移动到np.nan,然后写入整个文件。

df.drop(['score', 'evalue', 'Description', 'EC', 'PFAMs'],axis=1).replace('-', np.nan)
df.to_csv('my.csv',sep='\t',index=False)

如何在pandas迭代器下完成此操作?

mzsu5hc0

mzsu5hc01#

IIUC,您可以:

cols_to_drop = ['score', 'evalue', 'Description', 'EC', 'PFAMs']
data = []
for chunk in pd.read_csv('myinfile.csv', sep='\t', na_values='-', chunksize=100):
    chunk = chunk.drop(columns=cols_to_drop)
    data.append(chunk)
pd.concat(data).to_csv('my.csv', sep='\t', index=False)

如果您知道要保留的列而不是要删除的列,请用途:

cols_to_keep = ['col1', 'col2', 'col3']
data = []
for chunk in pd.read_csv('myinfile.csv', usecols=cols_to_keep, usesep='\t', na_values='-', chunksize=100):
    data.append(chunk)
pd.concat(data).to_csv('my.csv', sep='\t', index=False)

@el_oso的启发:

cols_to_drop = ['score', 'evalue', 'Description', 'EC', 'PFAMs']
with (open('myinfile.csv') as inp,
      open('my.csv', 'w') as out):
    headers = inp.readline().split('\t')
    out.write('\t'.join([col for col in headers if col not in cols_to_drop]))
    for chunk in pd.read_csv(inp, header=None, names=headers, sep='\t', na_values='-', chunksize=100):
        chunk = chunk.drop(columns=cols_to_drop)
        chunk.to_csv(out, sep='\t', index=False, header=False)
hpcdzsge

hpcdzsge2#

如果你在阅读文件时已经遇到内存问题,下面的方法实际上会以块的形式对新文件进行读写。

cols_to_keep = {'col1', 'col2', 'col3'}
df = pd.read_csv('myinfile.csv', chunksize=10, usecols=cols_to_keep)
with open('my.csv', 'w') as f:
    f.write('\t'.join(cols_to_keep) + '\n')
    for chunk in df:
        #do your processing here, appending that chunk to the file
        chunk.to_csv(f, header=None, sep='\t')

f is _io.TextIOWrapper即可以在小内存块中一致写入的流

相关问题