Je souhaite créer une nouvelle colonne comp
dans une base de données pandas contenant une seule colonne price
. La valeur de cette nouvelle colonne doit être générée par une fonction qui fonctionne sur les 3 dernières valeurs du price
. df.apply()
fonctionne sur une seule ligne, shift()
ne semble pas fonctionner. Les experts ont-ils des suggestions pour le faire fonctionner dans une opération vectorisée?accéder aux lignes précédentes dans la méthode data python appliquer la méthode
-1
A
Répondre
0
Utilisez une fonction de somme de série group.apply(). Ci-dessous suppose que vous avez un index ou une colonne nommée ID de valeurs de ligne croissantes 1, 2, 3, ... qui peut être utilisé pour compter 3 valeurs en arrière.
# SERIES SUM FUNCTION
def intsum(x):
if x < 3:
ser = df.price[(df.ID < x)]
else:
ser = df.price[(df.ID >= x - 3) & (df.ID < x)]
return ser.sum()
# APPLY FUNCTION
df['comp'] = df['ID'].apply(intsum)
0
Vous pouvez utiliser rolling_sum
avec le paramètre min_periods=1
, parce que vous voulez compter les premières valeurs aussi:
print df
price
0 1
1 2
2 3
3 4
4 5
5 6
6 7
df['comp'] = pd.rolling_sum(df['price'], window=3, min_periods=1)
print df
price comp
0 1 1
1 2 3
2 3 6
3 4 9
4 5 12
5 6 15
6 7 18
solution suivante est d'utiliser map
:
print df
price
0 1
1 2
2 3
3 4
4 5
5 6
6 7
def f(x):
return (df.price[(df.index - 1 >= x - 3) & (df.index - 1 < x)]).sum()
df['comp'] = df.index.map(f)
print df
price comp
0 1 1
1 2 3
2 3 6
3 4 9
4 5 12
5 6 15
6 7 18
'pd.rolling_apply' –
Vous pourriez vouloir votre tentative avec les méthodes 'shift' ou' rolling_apply'. –
Pouvez-vous ajouter un exemple? Peut-être aider [ceci] (http://stackoverflow.com/help/mcve) et comment Stackoverflow [fonctionne] (http://stackoverflow.com/tour). – jezrael