как заполнить пропущенные значения не пропущенными значениями одного столбца для идентичных значений двух других столбцов в pandas?

#python #pandas #missing-data

#python #pandas #отсутствует-данные

Вопрос:

Мой фрейм данных выглядит следующим образом:

               date currency  exchange_rate
222     1987-05-01      USD         1.0000
226     2019-11-01      AUD         1.4730
           ...      ...            ...
1455221 2019-10-01      AUD         1.4710
1455222 2019-11-01      AUD            NaN
  

Для каждого NaN в столбце exchange_rate я хочу заполнить его значением с одинаковыми значениями в валюте и дате.
Итак, я хочу, чтобы это выглядело следующим образом:

               date currency  exchange_rate
222     1987-05-01      USD         1.0000
226     2019-11-01      AUD         1.4730
           ...      ...            ...
1455221 2019-10-01      AUD         1.4710
1455222 2019-11-01      AUD         1.4730
  

Спасибо

Ответ №1:

Вы можете получить первое не пропущенное значение для групп с помощью GroupBy.transform и GroupBy.first , а затем повторно использовать неправильные значения по ним:

 s = df.groupby(['date', 'currency'])['exchange_rate'].transform('first')
df['exchange_rate'] = df['exchange_rate'].fillna(s)
  

Или:

 df['exchange_rate'] = df['exchange_rate'].combine_first(s)
  

 print (df)
               date currency  exchange_rate
222      1987-05-01      USD          1.000
226      2019-11-01      AUD          1.473
1455221  2019-10-01      AUD          1.471
1455222  2019-11-01      AUD          1.473
  

Проверьте, является ли первое значение для группы NaN :

 print (df)
               date currency  exchange_rate
222      1987-05-01      USD          1.000
226      2019-11-01      AUD            NaN
1455221  2019-10-01      AUD          1.471
1455222  2019-11-01      AUD         50.000


s = df.groupby(['date', 'currency'])['exchange_rate'].transform('first')
df['exchange_rate'] = df['exchange_rate'].fillna(s)
print (df)
               date currency  exchange_rate
222      1987-05-01      USD          1.000
226      2019-11-01      AUD         50.000
1455221  2019-10-01      AUD          1.471
1455222  2019-11-01      AUD         50.000
  

Комментарии:

1. что, если первое значение группы nan ?

2. @deadshot — Затем, используя первое значение, отличное от NaN, протестировано.

3. @jezrael Вы имеете в виду своим комментарием, что если первое значение равно NaN, оно будет заполнено первым подходящим значением, отличным от NaN?

Ответ №2:

Попробуйте с

 df['exchange_rate'] = df.groupby(['date', 'Currency'])['exchange_rate'].apply(lambda x : x.ffill().bfill())