Назначить значение для всей группы на основе условий - PullRequest
0 голосов
/ 02 мая 2018

Я новичок во всем этом, поэтому извините заранее:

У меня есть датафрейм, который выглядит так:

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

Сначала это то, что я хочу, но он смотрит только на первую выдачу для всего фрейма данных (поэтому столбец «с фиксированным разбросом» останется на уровне 3,42 для всех строк в приведенном выше примере с df).

Есть предложения по достижению того, чего я хочу?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Использование 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
0 голосов
/ 02 мая 2018

Я бы просто создал временный фрейм данных только со строками, в которых Дата выпуска равна Дате, а затем соединил бы его с первым фреймом данных на основе ключа Выдачи.

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

, вероятно, не оптимально, но должно работать.

...