如何从.csv文件中删除列而不读取整个文件

时间:2016-09-12 09:51:18

标签: python csv pandas

我生成非常大的.csv文件,但现在它不适合RAM。所以我决定删除一些低效的列来减少文件大小。我怎样才能做到这一点?

我尝试过data = pd.read_csv("file.csv", index_col=0, usecols=["id", "wall"]),但它仍然不适合RAM。

文件大约是1.5GB,RAM是8GB。

2 个答案:

答案 0 :(得分:1)

您还可以使用DictReader(如果您没有使用Pandas)从csv文件中读取特定列,而不是删除列。

import csv
from StringIO import StringIO

columns = 'AAA,DDD,FFF,GGG'.split(',')


testdata ='''\
AAA,bbb,ccc,DDD,eee,FFF,GGG,hhh
1,2,3,4,50,3,20,4
2,1,3,5,24,2,23,5
4,1,3,6,34,1,22,5
2,1,3,5,24,2,23,5
2,1,3,5,24,2,23,5
'''

reader = csv.DictReader(StringIO(testdata))

desired_cols = (tuple(row[col] for col in columns) for row in reader)

输出:

>>> list(desired_cols)
[('1', '4', '3', '20'),
 ('2', '5', '2', '23'),
 ('4', '6', '1', '22'),
 ('2', '5', '2', '23'),
 ('2', '5', '2', '23')]

来源:https://stackoverflow.com/a/20065131/6633975

使用Pandas:

这是一个说明EdChum给出的答案的例子。加载CSV文件还有很多其他选项,请查看API reference

import pandas as pd


raw_data = {'first_name': ['Steve', 'Guido', 'John'],
        'last_name': ['Jobs', 'Van Rossum', "von Neumann"]}
df = pd.DataFrame(raw_data)
# Saving data without header
df.to_csv(path_or_buf='test.csv', header=False)
# Telling that there is no header and loading only the first name
df = pd.read_csv(filepath_or_buffer='test.csv', header=None, usecols=[1], names=['first_name'])
df

  first_name
0      Steve
1      Guido
2       John

答案 1 :(得分:0)

我不确定这是否可能在熊猫中。您可以尝试在命令行中执行此操作。在Linux上它看起来像:

Object

如果要删除索引为3和4的列。