Mon dataframe se présente comme suit:

              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

Pour chaque NaN dans la colonne exchange_rate, je veux le remplir avec une valeur avec les mêmes valeurs en devise et en date. Je veux donc que cela ressemble à ceci:

              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

Je vous remercie

1
Olivier 3 sept. 2020 à 16:24

2 réponses

Meilleure réponse

Vous pouvez obtenir la première valeur non manquante par groupe par GroupBy.transform et GroupBy.first, puis repalonnez les valeurs erronées par eux:

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

Ou:

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

Testez si la première valeur par groupe est 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
jezrael 3 sept. 2020 à 13:34

Essayez avec

df['exchange_rate'] = df.groupby(['date', 'Currency'])['exchange_rate'].apply(lambda x : x.ffill().bfill())
1
BENY 3 sept. 2020 à 13:27