在2个数据帧中应用函数

时间:2017-08-23 07:59:47

标签: python pandas dataframe

我有两个使用pandas read_excel的数据帧。目前,我正面临着一项挑战,即尝试根据列标题和列值在两个数据框架中应用函数。

Dataframe A(bondDf)是债券数据,其中第一列是索引(也尝试使用多索引头但失败了)

ISIN    ABCDE123    DEFGHI245   ASKDNA123   AJSNDJAKS2
Issue Date  18/01/2005  31/01/2008  15/02/2000  15/02/2007
Maturity    15/01/2010  31/01/2010  15/02/2010  15/02/2010
First Coupon Date   15/07/2005  31/07/2008  15/08/2000  15/08/2007
Cpn 3.9875  2.3375  7.15    5.225
31/12/2008  103.515625  101.875 106.609375  104.796875
30/01/2009  102.9375    101.546875  106.109375  104.28125
27/02/2009  102.546875  101.234375  105.453125  103.796875
31/03/2009  102.453125  101.296875  105.140625  103.609375
30/04/2009  102.3125    101.28125   104.796875  103.40625

enter image description here

Dataframe B(futuresDf)是期货数据,其中第一列的索引类似

Index   FUT_DLV_DT_FIRST
31/12/2008  02/03/2009
30/01/2009  02/03/2009
27/02/2009  02/03/2009
31/03/2009  01/06/2009
30/04/2009  01/06/2009

enter image description here

我试图在bonddf(103.51,101.875等)中为每个债券价格应用以下函数

def inBasket(b_issueDate, b_maturityDate, f_firstDeliveryDate, currentDate):
if b_issueDate < currentDate:

    DateDiffMonths          =   (f_firstDeliveryDate - b_maturityDate).days
    # other simple computation below

到目前为止,我尝试的是:

bondDf.iloc[6:].apply(lambda x: inBasket(f_contract, x.loc['Issue Date'], 
                x.loc['Maturity'], futuresDf.iloc[:]['FUT_DLV_DT_FIRST'], 
                bondDf.index.values[6:]), 0))

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我不知道你如何链接你的两个帧(显然,按日期,但是一个示例输出可以很好地清除它),但我想如果你想使用日期作为输入,那么你必须使用futuresDf作为输入。我的猜测是在BondDf上使用布尔索引,例如

 bondDf[bondDf.index==futuresDf] and perform the assignation from there. Or use a where method.

但我认为你选择了一种不好的方式在你的框架中表示你的数据,因为它们不适合自然。如果在数据框架中明确了这种关系,则可以轻松地加入/操作它们。在这里它无法完成。我甚至无法预测对应于与债券第二列相比较的五个日期的未来预测行的标题。
如果我手头有这样的问题,我会将数据重构为每个原始的bondsDf列的一个帧,其中五行与每个futuresDf行匹配,或者转置原始数据帧并加入它们。这种比较会更容易。

编辑: 我的看法如下:拿你的df bondsDF并计算指数的每个日期(如#34;当前日期&#34;)是否会低于&#34;发行日期&#34;):

df
Out[53]: 
                            1           2           3           4
0                                                                
ISIN                 ABCDE123   DEFGHI245   ASKDNA123  AJSNDJAKS2
Issue Date         18/01/2005  31/01/2008  15/02/2000  15/02/2007
Maturity           15/01/2010  31/01/2010  15/02/2010  15/02/2010
First Coupon Date  15/07/2005  31/07/2008  15/08/2000  15/08/2007
Cpn                    3.9875      2.3375        7.15       5.225
31/12/2008         103.515625     101.875  106.609375  104.796875
30/01/2009           102.9375  101.546875  106.109375   104.28125
27/02/2009         102.546875  101.234375  105.453125  103.796875
31/03/2009         102.453125  101.296875  105.140625  103.609375
30/04/2009           102.3125   101.28125  104.796875   103.40625

sd=df.loc("Issue Date",:)
truth =sd.apply(lambda x: x<df.index[5:])

从这里开始,你根据相同的原理用所有df的其他日期执行计算,然后根据真值分配,然后通过切片正确的方式处理相应的值并使用元素执行操作两个数据帧。例如df.loc [5:,:] * values_df_based_on_truth *标量......