2
votes

Créer un index avec Pandas

Supposons que j'ai le dataframe suivant:

df['index']=.... ???

Je veux définir 25 (dernier élément) sur 100 dans une nouvelle colonne, puis travailler en arrière en faisant 50 * 100/25 = 200, 32 * 100/25 = 32 * 200/50 = 128..et ainsi de suite

   return index
0      25  
1      28   
2      32   128
3      50   200
4      25   100

Y a-t-il un moyen de faire cela en -de préférence- une ligne. Merci!

import pandas as pd
df = pd.DataFrame({'return':[10, 28, 32, 50, 25]})


1 commentaires

df ['index'] = df ['return'] * 4 ?


3 Réponses :


0
votes

Peut-être comme ça?

    return  index
0   10  40.0
1   28  112.0
2   32  128.0
3   50  200.0
4   25  100.0

Cela donne:

import pandas as pd
df = pd.DataFrame({'return':[10, 28, 32, 50, 25]})

last = df["return"].iloc[-1] 
df['index'] = df['return'].apply(lambda x: x*(100/last))

df


4 commentaires

Ce serait bien si au lieu de coder en dur 25 vous faisiez last = df ["return"]. Iloc [-1] puis df ['index'] = df ['return' ] .apply (lambda x: x * (100 / dernier))


Question: utiliser les fonctions lambda équivaut à vectoriser le code? Ou cela prend-il autant de temps qu'une boucle for à travers toutes les valeurs?


@Oniropolo Non, c'est le contraire.


Si possible, n'utilisez pas apply () avec les fonctions lambda. C'est plus lent que les opérations vectorisées.



2
votes

Vous pouvez utiliser iat code> pour extraire la dernière valeur d'une série:

df['index'] = df['return'] * 100 / df['return'].iat[-1]

print(df)

   return  index
0      10   40.0
1      28  112.0
2      32  128.0
3      50  200.0
4      25  100.0


0 commentaires

1
votes

Oui, c'est possible avec une ligne. Utilisez simplement df ['return']. Iloc [-1] pour obtenir la dernière valeur de la colonne return , puis faites simplement comme ci-dessous -

       return  index
0      10     40
1      28    112
2      32    128
3      50    200
4      25    100


2 commentaires

Dans le cas général , vous ne voudrez probablement pas convertir en int . Ici, nous avons un facteur int car 25 est un diviseur de 100.


@jpp a accepté monsieur, je suis juste la sortie attendue de l'OP, c'est pourquoi converti en int