我有一个数据集,其维度大约是2,000(行)x 120,000(列)。
我想选择某些专栏(约8,000列)。
因此文件维度为2,000(行)x 8,000(列)。
这是一个好人写的代码(我从stackoverflow搜索但很抱歉我忘了他的名字)。
import pandas as pd
df = pd.read_csv('...mydata.csv')
my_query = pd.read_csv('...myquery.csv')
df[list['Name'].unique()].to_csv('output.csv')
但是,结果在我的控制台中显示 MemoryError ,这意味着代码可能无法正常运行。
那么有没有人知道如何用更有效的方式来选择某些列来改进代码?
感谢您的帮助,
答案 0 :(得分:1)
我想我找到了你的source。
所以,我的解决方案使用带有参数的read_csv
:
iterator=True
- 如果为True,则返回TextFileReader
以启用将文件逐段读入内存chunksize=1000
- 用于将文件“分块”为多个行的行数。将导致返回TextFileReader
个对象usecols=subset
- 要返回的列子集,可以大大加快解析时间并降低内存使用量我使用usecols
过滤大型数据集 - 我只使用数据集(2 000,8 000)(2 000,120 000)。
import pandas as pd
#read subset from csv and remove duplicate indices
subset = pd.read_csv('8kx1.csv', index_col=[0]).index.unique()
print subset
#use subset as filter of columns
tp = pd.read_csv('input.csv',iterator=True, chunksize=1000, usecols=subset)
df = pd.concat(tp, ignore_index=True)
print df.head()
print df.shape
#write to csv
df.to_csv('output.csv',iterator=True, chunksize=1000)
我使用此代码段进行测试:
import pandas as pd
import io
temp=u"""A,B,C,D,E,F,G
1,2,3,4,5,6,7"""
temp1=u"""Name
B
B
C
B
C
C
E
F"""
subset = pd.read_csv(io.StringIO(temp1), index_col=[0]).index.unique()
print subset
#use subset as filter of columns
df = pd.read_csv(io.StringIO(temp), usecols=subset)
print df.head()
print df.shape