web-dev-qa-db-fra.com

Comment décaler une colonne dans Pandas DataFrame

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
83
root
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
140
eumiro

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
5
David Ferris

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)
4
ayush jain

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.

3
Kay Wittig

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
3
martin-voj

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.

1
Tha_franklin

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.

0
KIC