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 pd
import numpy as np
data = np.arange(1,31)
data = data.reshape(10,3)
df = pd.DataFrame(data=data,columns=['a','b','c'])
print(df)
donne alors
a b c
0 1 2 3
1 4 5 6
2 7 8 9
3 10 11 12
4 13 14 15
5 16 17 18
6 19 20 21
7 22 23 24
8 25 26 27
9 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 NaN
1 NaN
2 NaN
3 3.0
4 6.0
5 9.0
6 12.0
7 15.0
8 18.0
9 21.0
Name: 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.0
1 15.0
2 18.0
3 21.0
4 24.0
5 27.0
6 30.0
7 NaN
8 NaN
9 NaN
Name: 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 NaN
1 3.0
2 6.0
3 9.0
4 12.0
5 15.0
6 18.0
7 21.0
8 24.0
9 27.0
Name: 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 -99999
1 -99999
2 -99999
3 3
4 6
5 9
6 12
7 15
8 18
9 21
Name: 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-2
0 1 2 3 -99999 -99999 6 9
1 4 5 6 3 -99999 9 12
2 7 8 9 6 3 12 15
3 10 11 12 9 6 15 18
4 13 14 15 12 9 18 21
5 16 17 18 15 12 21 24
6 19 20 21 18 15 24 27
7 22 23 24 21 18 27 30
8 25 26 27 24 21 30 -99999
9 28 29 30 27 24 -99999 -99999