以递归方式将行添加到Pandas Dataframe

时间:2018-01-10 21:25:48

标签: python-3.x pandas

我在Pandas数据帧中有多行。根据行中的数据,我想添加额外的行,并且正在寻找最有效的方法。以下是仅有两行数据集的示例:

import pandas as pd
end_date="2020-12-31"
df= pd.DataFrame({'type':['Asset','Liability'],'Amount':\
[10,-5],'Maturity Date':['2018-01-22','2018-01-23'],\
'Original Maturity':[365,730]})

原始到期日是指新交易的天数。因此,当资产到期时,它会以原始资产到期后的365天内的原始到期日和到期日进行复制。

我希望根据2020-12-31的结束日期和原始成熟度列复制行。每个新行的成熟度列需要反映修订的成熟度。对于上面的数据集,我希望看到以下输出:

df= pd.DataFrame({'type':\
['Asset','Liability','Asset','Asset','Liability']\
,'Amount':[10,-5,10,10,-5],'Maturity Date':['2018-01-22',\
'2018-01-23','2019-01-22','2020-01-22','2020-01-23'],\
'Original Maturity':[365,730,365,365,730]})
df

在这种情况下,"类型"资产将被复制两次,而由于原始成熟度,责任将仅复制一次。

对编写此逻辑的最有效方法感到好奇。

1 个答案:

答案 0 :(得分:2)

能够根据@coldspeed的初始代码找出答案

df['Maturity Date'] = pd.to_datetime(df['Maturity Date'], errors='coerce')

i = pd.to_datetime(end_date)
j = df['Maturity Date'] 
d=round(((i-j).dt.days)/(df['Original Maturity']).clip(0))
e = pd.to_numeric(d).round(1).astype(int) +1


idx = df.index.repeat(e)


df = df.reindex(index=idx)


df['Maturity Date'] += pd.to_timedelta(df.groupby(level=0).cumcount()*df['Original Maturity'], unit='D')
df.reset_index(drop=True).sort_values('Maturity Date')


df