Exemples de comment décaler de une ou plusieurs lignes les valeurs d'une colonne d'une dataframe avec pandas en python:
Créer une dataframe avec pandas
Créons d'abord une dataframe avec pandas :
import pandas as pdimport numpy as npdata = np.arange(1,31)data = data.reshape(10,3)df = pd.DataFrame(data=data,columns=['a','b','c'])print(df)
donne alors
a b c0 1 2 31 4 5 62 7 8 93 10 11 124 13 14 155 16 17 186 19 20 217 22 23 248 25 26 279 28 29 30
Décaler de une ou plusieurs lignes les valeurs d'une colonne donnée
Décaler les lignes vers le bas ou vers le haut
Pour décaler par exemple de 3 lignes vers le bas pour la colonne c, une solution est d'utiliser pandas.DataFrame.shift.
Note: le paramètre "periods" défini le nombre de lignes à décaler:
df = df['c'].shift(periods=3)print(df)
donne
0 NaN1 NaN2 NaN3 3.04 6.05 9.06 12.07 15.08 18.09 21.0Name: c, dtype: float64
Décaler de 3 lignes vers le haut pour la colonne c
df = pd.DataFrame(data=data,columns=['a','b','c'])df = df['c'].shift(periods=-3)print(df)
donne
0 12.01 15.02 18.03 21.04 24.05 27.06 30.07 NaN8 NaN9 NaNName: c, dtype: float64
Autre exemple de décalage d'une seule ligne :
df = pd.DataFrame(data=data,columns=['a','b','c'])df = df['c'].shift(periods=1)print(df)
donne
0 NaN1 3.02 6.03 9.04 12.05 15.06 18.07 21.08 24.09 27.0Name: c, dtype: float64
Definir fill_value
Par défaut fill_value est NaN mais il est possible de définir une autre valeur en utilisant le paramètre fill_value :
df = pd.DataFrame(data=data,columns=['a','b','c'])df = df['c'].shift(periods=3, fill_value=-99999)print(df)
donne
0 -999991 -999992 -999993 34 65 96 127 158 189 21Name: c, dtype: int64
Créer de nouvelles colonnes avec les valeurs des voisins les plus proches
Un autre exemple créons de nouvelles colonnes avec les valeurs des voisins les plus proches
df = pd.DataFrame(data=data,columns=['a','b','c'])df["n+1"] = df['c'].shift(periods=1, fill_value=-99999)df["n+2"] = df['c'].shift(periods=2, fill_value=-99999)df["n-1"] = df['c'].shift(periods=-1, fill_value=-99999)df["n-2"] = df['c'].shift(periods=-2, fill_value=-99999)print(df)
donne
a b c n+1 n+2 n-1 n-20 1 2 3 -99999 -99999 6 91 4 5 6 3 -99999 9 122 7 8 9 6 3 12 153 10 11 12 9 6 15 184 13 14 15 12 9 18 215 16 17 18 15 12 21 246 19 20 21 18 15 24 277 22 23 24 21 18 27 308 25 26 27 24 21 30 -999999 28 29 30 27 24 -99999 -99999
