【问题标题】:Assign value to entire group based on conditions根据条件为整个组分配价值
【发布时间】:2018-05-02 17:06:07
【问题描述】:

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

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

   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 示例中的所有行,'fixed spread' 列将保持在 3.42)。

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

【问题讨论】:

  • 3/31/2018 != 3/31/2019 但已为该行设置了固定点差。你能检查一下吗?
  • 抱歉!我实际 df 中的第二个发行日期是 3/31/2019
  • 您能否修复您的数据,以便我将其复制到答案中?
  • 是的 - 完成了!谢谢!

标签: python pandas dataframe conditional-statements equality


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    可能不是最佳的,但它应该可以工作。

    【讨论】:

    • 在这里合并是多余的。
    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 2018-04-30
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多