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]})
3 Réponses :
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
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.
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
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
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
df ['index'] = df ['return'] * 4?