根据条件为整个组分配值

时间:2018-05-02 17:06:08

标签: python pandas dataframe conditional-statements equality

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

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

   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)。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

我只想创建一个临时数据框,其中只包含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')

可能不是最佳但它应该有用。