根据条件为整个组分配值
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
我是新手,提前致歉:
我有一个如下所示的数据框:
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