Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中向现有数据帧追加重影行的优化算法_Python_Algorithm_Pandas_Dataframe - Fatal编程技术网

Python中向现有数据帧追加重影行的优化算法

Python中向现有数据帧追加重影行的优化算法,python,algorithm,pandas,dataframe,Python,Algorithm,Pandas,Dataframe,我有一个数据帧,我想将重影行(现有行的副本)附加到数据帧 id month as_of_date1 turn age 119 5712 201401 2014-01-01 9 0 120 5712 201402 2014-02-01 9 1 121 5712 201403 2014-03-01 9 2 122 5712 201404 2014-04-01 9 3 123 5712 201405 2014-05

我有一个数据帧,我想将重影行(现有行的副本)附加到数据帧

       id   month  as_of_date1 turn  age 
119 5712    201401  2014-01-01  9   0
120 5712    201402  2014-02-01  9   1
121 5712    201403  2014-03-01  9   2
122 5712    201404  2014-04-01  9   3
123 5712    201405  2014-05-01  9   4
124 5712    201406  2014-06-01  9   5
125 9130    201401  2014-01-01  9   0
126 9130    201402  2014-02-01  9   1
127 9130    201403  2014-03-01  9   2
128 9130    201404  2014-04-01  9   3
129 9130    201405  2014-05-01  9   4
重影行由以下条件选择: 如果age小于turn,我们需要追加最新的行,直到
age==turn of
作为\u of_date1==now()

现在我正在使用下面的代码,但是由于数据很大,大约有200000行,有100个字段,所以它永远需要

tdf1=tdf.loc[(tdf['age']<tdf['turn'])]
tdf2=tdf1.drop_duplicates(subset=['id'],keep='last')
leads=tdf2.index.tolist()
for lead in leads:
    ttdf=tdf.loc[[lead]]
    diff1 = relativedelta.relativedelta(datetime.datetime(2018,6,1),tdf.loc[lead,'as_of_date1']).months
    diff2=tdf.loc[lead,'turn']-tdf.loc[lead,'age']
    diff=min(diff1,diff2)
    for i in range(0,diff):
        tdf = tdf.append(ttdf, ignore_index=True)

如果有人知道一个更快的算法,

,我将不胜感激,因为@Parfit在附加到数据帧的注释中提到了这个算法,它确实会消耗内存,在循环中执行它根本不被建议。所以我用了下面的方法,难以置信地提高了速度

a=[]
for lead in leads:
    ttdf=tdf.loc[[lead]]
    diff1 = relativedelta.relativedelta(datetime.datetime(2018,6,1),tdf.loc[lead,'as_of_date1']).months
    diff2=tdf.loc[lead,'turn']-tdf.loc[lead,'age']
    diff=min(diff1,diff2)
    for i in range(0,diff):
        a.append(ttdf)

tdf = tdf.append(a, ignore_index=True)

你能包括你的预期产出吗?我认为,在您的示例中,在循环中,您可以在中间数组中附加ttdf,然后使用类似于np.concatenate的东西。它会更快。
a=[]
for lead in leads:
    ttdf=tdf.loc[[lead]]
    diff1 = relativedelta.relativedelta(datetime.datetime(2018,6,1),tdf.loc[lead,'as_of_date1']).months
    diff2=tdf.loc[lead,'turn']-tdf.loc[lead,'age']
    diff=min(diff1,diff2)
    for i in range(0,diff):
        a.append(ttdf)

tdf = tdf.append(a, ignore_index=True)