.loc是构建pandas DataFrame的最佳方法吗?

时间:2015-01-14 23:59:38

标签: python pandas dataframe

我有一个相当大的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)是字符串......

感谢

3 个答案:

答案 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)

如果我理解正确,我认为它会快得多:

  1. 使用pandas.read_csv将整个csv导入数据框。
  2. 从数据框中选择感兴趣的行。
  3. 使用df.append(other_df)将行附加到其他数据框。
  4. 如果您提供有关在步骤2中使用的标准的更多信息,我也可以在那里提供代码。

答案 2 :(得分:0)

想到几个选项

1)按原样解析文件,但构建一个附加到数据帧的dict意图。完成转换后,将dict转换为Dataframe,然后使用concat()将其与现有的Dataframe结合

2)使用read_csv()将csv带入pandas然后过滤/解析你想要的东西,然后用现有的数据帧做一个concat()