Mettre à jour la boucle de trame de données rangées

Simon de Fauconval :

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

Bishwarup Bhattacharjee:
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()

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=378024&siteId=1
conseillé
Classement