我有一个相当大的csv文件(700mb),其组装如下:
qCode Date Value A_EVENTS 11/17/2014 202901 A_EVENTS 11/4/2014 801 A_EVENTS 11/3/2014 2.02E+14 A_EVENTS 10/17/2014 203901 etc.
我正在解析此文件以获取特定值,然后使用DF.loc填充预先存在的DataFrame,即代码:
for fileParse中的行:
code=line[0]
for point in fields:
if(point==code[code.find('_')+1:len(code)]):
date=line[1]
year,quarter=quarter_map(date)
value=float(line[2])
pos=line[0].find('_')
ticker=line[0][0:pos]
i=ticker+str(int(float(year)))+str(int(float(quarter)))
df.loc[i,point]=value
else:
pass
我遇到的问题是.loc是将值添加到现有DataFrame的最有效方法吗?由于此操作似乎需要10个多小时......
fyi字段是DF中的col(我感兴趣的值),而索引(i)是字符串......
感谢
答案 0 :(得分:1)
否,您不应该逐行构建数据框。每次执行此操作时,必须复制整个数据帧(它未在原位扩展),因此您使用的是n +(n - 1)+(n - 2)+ ... + 1,O(n ^ 2),记忆(必须进行垃圾收集)......这很糟糕,因此需要几个小时!
您想使用read_csv
,您有几个选择:
一次性读入整个文件(即使只有几个ram,这应该可以很好用700mb)。
pd.read_csv('your_file.csv')
在块中读取csv,然后将它们粘在一起(在内存中)... tbh我不认为这实际上会比上面使用更少的内存,但如果你正在做的话通常很有用在这一步有些沉默。
pd.concat(pd.read_csv('foo.csv', chunksize=100000)) # not sure what optimum value is for chunksize
以块的形式读取csv并将它们保存到pytables(而不是内存中),如果你有更多的数据而不是内存(并且你已经购买了更多的内存),那么使用pytables / hdf5!
store = pd.HDFStore('store.h5')
for df in pd.read_csv('foo.csv', chunksize=100000):
store.append('df', df)
答案 1 :(得分:0)
如果我理解正确,我认为它会快得多:
pandas.read_csv
将整个csv导入数据框。df.append(other_df)
将行附加到其他数据框。如果您提供有关在步骤2中使用的标准的更多信息,我也可以在那里提供代码。
答案 2 :(得分:0)
想到几个选项
1)按原样解析文件,但构建一个附加到数据帧的dict意图。完成转换后,将dict转换为Dataframe,然后使用concat()将其与现有的Dataframe结合
2)使用read_csv()将csv带入pandas然后过滤/解析你想要的东西,然后用现有的数据帧做一个concat()