J'ai un dataframe et je veux créer de nouvelles colonnes qui contiennent la croissance des colonnes d'origine.
Tout d'abord, j'ajouter les nouvelles colonnes à la trame de données, les remplir avec les valeurs NaN.
Ensuite, pour chaque ligne que je vérifie si les précédentes correspond de ligne à l'année précédente, et si elle ne je veux remplir la nouvelle colonne avec la croissance de la variable. Sinon, je laisse juste la valeur NaN.
Voici mon code:
for index, row in df.iterrows():
if df.loc[index,'year'] == df.loc[index - 1, 'year'] + 1 and df.loc[index,'name'] == df.loc[index - 1, 'name']:
df.loc[index,k:] = (df.loc[index,1:k-1]/df.loc[index-1,1:k-1]) - 1
Où k est l'indice de colonne de la première nouvelle colonne « de croissance » que j'ai créé.
Le problème avec ce code est qu'il laisse les nouvelles colonnes avec des valeurs NaN, sans aucun changement. Est-ce que je fais quelque chose de mal?
Merci
df.sort_values('year', inplace = True)
growth_cols = [<your-growth-cols>]
new_cols = [x + "_growth" for x in growth_cols]
growth_df = df[growth_cols] / df[growth_cols].shift(1)
growth_df.rename(columns = dict(zip(growth_cols, new_cols)), inplace = True)
df = pd.concat([df, growth_df], axis =1)
df['gap'] = df.year.diff()
for col in new_cols:
df[col] = df[col] * df['gap']
df[col].replace(0, np.nan, inplace = True)
df.drop('gap', axis = 1, inplace = True)
EDIT (en fonction de la question mise à jour):
Vous auriez besoin de changer la ligne
df['gap'] = df.year.diff()
à:
df['gap'] = df.groupby('name').diff()