首页 > 解决方案 > 根据条件为整个组分配价值

问题描述

我对这一切都很陌生,所以提前抱歉:

我有一个看起来像这样的数据框:

   Issuance Issue Date  Date        Spread
1   1       12/31/2018  12/31/2018   3.42 
2   1       12/31/2018  1/31/2019    3.45 
3   1       12/31/2018  2/28/2019    3.49 
4   1       12/31/2018  3/31/2019    3.52 
5   1       12/31/2018  4/30/2019    3.56 
6   1       12/31/2018  5/31/2019    3.59 
7   2       3/31/2019   3/31/2019    3.52 
8   2       3/31/2019   4/30/2019    3.56 
9   2       3/31/2019   5/31/2019    3.59 

我有一个发行和价差列表,我想创建一个新列“固定价差”以在“发行日期”等于“日期”并在所有日期保持固定时返回价差,如下所示:

  Issuance    Issue Date      Date     Spread   Fixed Spread
 1   1        12/31/2018    12/31/2018   3.42    3.42 
 2   1        12/31/2018    1/31/2019    3.45    3.42 
 3   1        12/31/2018    2/28/2019    3.49    3.42 
 4   1        12/31/2018    3/31/2019    3.52    3.42 
 5   1        12/31/2018    4/30/2019    3.56    3.42 
 6   1        12/31/2018    5/31/2019    3.59    3.42 
 7   2        3/31/2019     3/31/2019    3.52    3.52 
 8   2        3/31/2019     4/30/2019    3.56    3.52 
 9   2        3/31/2019     5/31/2019    3.59    3.52 

我已经非常接近了:

df['fixed_spread'] = df.loc[df['Issue Date'].idxmin(), 'spread']

这就是我最初想要的,但它只查看整个数据帧的第一次发布(因此对于上面的 df 示例中的所有行,“固定价差”列将保持在 3.42)。

关于实现我想要的任何建议?

标签: pythonpandasdataframeconditional-statementsequality

解决方案


使用where+ffill应该可以做到。

df['Fixed Spread'] =  df.Spread.where(df['Issue Date'] == df['Date']).ffill()

或者,

df['Fixed Spread'] =  df.Spread.mask(df['Issue Date'] != df['Date']).ffill()

df

   Issuance  Issue Date        Date  Spread  Fixed Spread
1         1  12/31/2018  12/31/2018    3.42          3.42
2         1  12/31/2018   1/31/2019    3.45          3.42
3         1  12/31/2018   2/28/2019    3.49          3.42
4         1  12/31/2018   3/31/2019    3.52          3.42
5         1  12/31/2018   4/30/2019    3.56          3.42
6         1  12/31/2018   5/31/2019    3.59          3.42
7         2   3/31/2019   3/31/2019    3.52          3.52
8         2   3/31/2019   4/30/2019    3.56          3.52
9         2   3/31/2019   5/31/2019    3.59          3.52

推荐阅读