我循环遍历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
的列,它包含一个整数值。我用来对这个数字求和的逻辑是:
从数据帧中获取这些列:
将这些行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