我正在寻找关于使用pandas迭代器的建议.

我使用Pythonpandas执行了一个解析操作,输入文件(一个名为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 迭代器下如何做到这一点?

推荐答案

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)

Python相关问答推荐

从包含数字和单词的文件中读取和获取数据集

Python中是否有方法从公共域检索搜索结果

如何通过多2多字段过滤查询集

根据在同一数据框中的查找向数据框添加值

如何将双框框列中的成对变成两个新列

将两只Pandas rame乘以指数

将图像拖到另一个图像

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

Polars:用氨纶的其他部分替换氨纶的部分

使用setuptools pyproject.toml和自定义目录树构建PyPi包

我们可以为Flask模型中的id字段主键设置默认uuid吗

如何在图中标记平均点?

什么是合并两个embrame的最佳方法,其中一个有日期范围,另一个有日期没有任何共享列?

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

为什么在FastAPI中创建与数据库的连接时需要使用生成器?

将一个双框爆炸到另一个双框的范围内

30个非DATETIME天内的累计金额

在numpy数组中寻找楼梯状 struct

在极点中读取、扫描和接收有什么不同?

分解polars DataFrame列而不重复其他列值