根据条件为整个组分配值

Assign value to entire group based on conditions

我是新手,提前致歉:

我有一个如下所示的数据框:

   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 

我有发行量和价差列表,我想在 "Issue Date" 等于 "Date" 时为 return 新列 'fixed spread' 和所有日期都保持固定,如下所示:

  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']

这首先做了我想要的,但它只查看整个数据框的第一次发布(因此 'fixed spread' 列对于上面的 df 示例中的所有行将保持在 3.42)。

有什么关于实现我想要的建议吗?

我只创建一个临时数据框,其中仅包含 Issue Date 等于 Date 的行,然后根据 Issuance 键将其与第一个数据框连接起来。

tmp_df = df[df['Issue Date']==df['Date']][['Issuance','Spread']]
tmp_df.columns = ['Issuance','Fixed Spread']
df = pd.merge(df,tmp_df,how='left',on='Issuance')

可能不是最佳选择,但应该可以。

使用 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