Je voudrais décaler une colonne dans un Pandas DataFrame
, mais je n'ai pas été en mesure de trouver une méthode pour le faire à partir de la documentation sans réécrire tout le DF. Quelqu'un sait-il comment faire? DataFrame:
## x1 x2
##0 206 214
##1 226 234
##2 245 253
##3 265 272
##4 283 291
Sortie désirée:
## x1 x2
##0 206 nan
##1 226 214
##2 245 234
##3 265 253
##4 283 272
##5 nan 291
In [18]: a
Out[18]:
x1 x2
0 0 5
1 1 6
2 2 7
3 3 8
4 4 9
In [19]: a.x2 = a.x2.shift(1)
In [20]: a
Out[20]:
x1 x2
0 0 NaN
1 1 5
2 2 6
3 3 7
4 4 8
Si vous ne voulez pas perdre les colonnes que vous dépassez la fin de votre cadre de données, ajoutez simplement le numéro requis en premier:
offset = 5
DF = DF.append([np.nan for x in range(offset)])
DF = DF.shift(periods=offset)
DF = DF.reset_index() #Only works if sequential index
Vous devez utiliser df.shift ici
df.shift (i) décale l'ensemble du cadre de données de i unités.
Donc pour i = 1
Contribution:
x1 x2
0 206 214
1 226 234
2 245 253
3 265 272
4 283 291
Sortie:
x1 x2
0 Nan Nan
1 206 214
2 226 234
3 245 253
4 265 272
Alors exécutez ce script pour obtenir le résultat attendu
import pandas as pd
df = pd.DataFrame({'x1': ['206', '226', '245',' 265', '283'],
'x2': ['214', '234', '253', '272', '291']})
print(df)
df['x2'] = df['x2'].shift(1)
print(df)
Permet de définir le dataframe à partir de votre exemple en
>>> df = pd.DataFrame([[206, 214], [226, 234], [245, 253], [265, 272], [283, 291]],
columns=[1, 2])
>>> df
1 2
0 206 214
1 226 234
2 245 253
3 265 272
4 283 291
Ensuite, vous pouvez manipuler l'index de la deuxième colonne en
>>> df[2].index = df[2].index+1
et enfin re-combiner les colonnes simples
>>> pd.concat([df[1], df[2]], axis=1)
1 2
0 206.0 NaN
1 226.0 214.0
2 245.0 234.0
3 265.0 253.0
4 283.0 272.0
5 NaN 291.0
Peut-être pas rapide mais simple à lire. Envisagez de définir des variables pour les noms de colonne et le décalage réel requis.
Edit: Généralement, le décalage est possible avec df[2].shift(1)
comme déjà posté, mais cela aurait pour effet de couper le report.
Je suppose que les importations
import pandas as pd
import numpy as np
Ajoute d'abord une nouvelle ligne avec NaN, NaN,...
à la fin de DataFrame (df
).
s1 = df.iloc[0] # copy 1st row to a new Series s1
s1[:] = np.NaN # set all values to NaN
df2 = df.append(s1, ignore_index=True) # add s1 to the end of df
Il va créer un nouveau DF df2. Peut-être y at-il moyen plus élégant mais cela fonctionne.
Maintenant, vous pouvez le déplacer:
df2.x2 = df2.x2.shift(1) # shift what you want
En essayant de répondre à un problème personnel et semblable au vôtre, j'ai trouvé sur Pandas Doc ce que je pense qui répondrait à cette question:
DataFrame.shift (périodes = 1, fréq = aucune, axe = 0) Décalage de l'index par le nombre souhaité de périodes avec une fréquence facultative
Notes
Si freq est spécifié, les valeurs d'index sont décalées mais les données ne sont pas réalignées. Autrement dit, utilisez freq si vous souhaitez étendre l'index lors du déplacement et conserver les données d'origine.
J'espère pouvoir aider les futures questions à ce sujet.
Voici comment je le fais:
df_ext = pd.DataFrame(index=pd.date_range(df.index[-1], periods=8, closed='right'))
df2 = pd.concat([df, df_ext], axis=0, sort=True)
df2["forecast"] = df2["some column"].shift(7)
Fondamentalement, je génère une base de données vide avec l'index souhaité, puis je les concatène ensemble. Mais j'aimerais vraiment voir cela comme une fonctionnalité standard dans pandas donc j'ai proposé une amélioration aux pandas.