【问题标题】:Is .loc the best way to build a pandas DataFrame?.loc 是构建 pandas DataFrame 的最佳方式吗?
【发布时间】:2015-01-14 23:59:37
【问题描述】:

我有一个相当大的 csv 文件 (700mb),其组装如下:

qCode 日期值 A_EVENTS 2014 年 11 月 17 日 202901 A_EVENTS 2014 年 11 月 4 日 801 A_EVENTS 11/3/2014 2.02E+14 A_EVENTS 2014 年 10 月 17 日 203901 等等

我正在解析该文件以获取特定值,然后使用 DF.loc 填充预先存在的 DataFrame,即代码:

文件解析中的行:

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) 是字符串...

谢谢

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    ,您永远不应该逐行构建数据框。每次执行此操作时,都必须复制整个数据帧(它不是就地扩展),因此您使用的是 n + (n - 1) + (n - 2) + ... + 1, O(n^2), memory (必须进行垃圾收集)......这很糟糕,因此需要几个小时!

    你想使用read_csv,你有几个选择:

    • 一口气读入整个文件(700mb 应该没问题,即使只有几 gig 的内存)。

      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)
      

    【讨论】:

      【解决方案2】:

      如果我理解正确,我认为这样会更快:

      1. 使用 pandas.read_csv 将整个 csv 导入数据框。
      2. 从数据框中选择感兴趣的行。
      3. 使用 df.append(other_df) 将行附加到您的其他数据框。

      如果您提供有关您在第 2 步中使用的标准的更多信息,我也可以在那里提供代码。

      【讨论】:

        【解决方案3】:

        想到的几个选项

        1) 像您当前所做的那样解析文件,但构建一个 dict 打算附加到您的数据帧。完成后将该 dict 转换为 Dataframe,然后使用 concat() 将其与现有 Dataframe 结合起来

        2) 使用 read_csv() 将该 csv 带入 pandas,然后过滤/解析您想要的内容,然后使用现有数据帧执行 concat()

        【讨论】:

          猜你喜欢
          • 2010-09-20
          • 1970-01-01
          • 2022-01-19
          • 1970-01-01
          • 2019-04-21
          • 2023-03-04
          • 1970-01-01
          • 2011-01-22
          • 1970-01-01
          相关资源
          最近更新 更多