如何加速数据帧分析

时间:2018-04-20 16:22:36

标签: python performance pandas

我循环遍历200k行的DataFrame。它做了我想做的事,但需要几个小时。当谈到你可以加入和操作DataFrames的所有方法时,我不是很复杂,所以我想知道我是否以非常低效的方式做这件事。这很简单,代码如下:

three_yr_gaps = []
for index, row in df.iterrows():
    three_yr_gaps.append(df[(df['GROUP_ID'] == row['GROUP_ID']) &
                            (df['BEG_DATE'] >= row['THREE_YEAR_AGO']) &
                            (df['END_DATE'] <= row['BEG_DATE'])]['GAP'].sum() + row['GAP'])
df['GAP_THREE'] = three_yr_gaps 

DF有一个名为GAP的列,它包含一个整数值。我用来对这个数字求和的逻辑是:

每行

从数据帧中获取这些列:

  1. 与群组ID匹配的内容,以及......
  2. 在此行开始日期的最后3年内具有开始日期的那些,并且......
  3. 在此行的开始日期之前有结束日期的那些。
  4. 将这些行GAP编号相加并添加此行的GAP数字,然后将其附加到索引列表中。

    那么是否有更快的方法将此逻辑引入某种自动合并或连接,以加快此过程?

    PS。

    我被要求对输入和输出做一些澄清,所以这里有一个构建的数据集:

    from dateutil import parser
    df = pd.DataFrame(  columns = ['ID_NBR','GROUP_ID','BEG_DATE','END_DATE','THREE_YEAR_AGO','GAP'],
                        data = [['09','185',parser.parse('2008-08-13'),parser.parse('2009-07-01'),parser.parse('2005-08-13'),44],
                                ['10','185',parser.parse('2009-08-04'),parser.parse('2010-01-18'),parser.parse('2006-08-04'),35],
                                ['11','185',parser.parse('2010-01-18'),parser.parse('2011-01-18'),parser.parse('2007-01-18'),0],
                                ['12','185',parser.parse('2014-09-04'),parser.parse('2015-09-04'),parser.parse('2011-09-04'),0]])
    

    以及我在脚本顶部写的内容可能有所帮助:

      

    此脚本的目的是提取差距计数   过去3年。它使用gaps.sql作为其源提取。这个查询   返回一个如下所示的DataFrame:

     ID_NBR  GROUP_ID  BEG_DATE    END_DATE    THREE_YEAR_AGO  GAP
     09      185       2008-08-13  2009-07-01  2005-08-13      44
     10      185       2009-08-04  2010-01-18  2006-08-04      35
     11      185       2010-01-18  2011-01-18  2007-01-18      0
     12      185       2014-09-04  2015-09-04  2011-09-04      0
    
      

    然后python代码回顾过去3年(那些   以前的行具有相同的GROUP_ID但其生效日期   来自他们自己的THIRD_YEAR_AGO,结束日期到来之前   他们自己的开始日期)。这些行相加,新列   被称为GAP_THREE。剩下的就是:

     ID_NBR  GROUP_ID  BEG_DATE    END_DATE    THREE_YEAR_AGO  GAP  GAP_THREE
     09      185       2008-08-13  2009-07-01  2005-08-13      44   44
     10      185       2009-08-04  2010-01-18  2006-08-04      35   79
     11      185       2010-01-18  2011-01-18  2007-01-18      0    79
     12      185       2014-09-04  2015-09-04  2011-09-04      0    0
    
      

    您注意到行id_nbr 11在过去3年中的值为79但id_nbr 12的值为0,因为2009年的最后一个差距是35,这是在12年的开始日期之前超过3年2014

0 个答案:

没有答案