Een kolom verschuiven in Pandas DataFrame

Ik zou graag een kolom in een Pandas DataFramewillen verplaatsen, maar ik heb in de documentatie geen methode kunnen vinden om dit te doen zonder de hele DF te herschrijven. Weet iemand hoe het moet?
DataFrame:

##    x1   x2
##0  206  214
##1  226  234
##2  245  253
##3  265  272
##4  283  291

Gewenste uitvoer:

##    x1   x2
##0  206  nan
##1  226  214
##2  245  234
##3  265  253
##4  283  272
##5  nan  291

Antwoord 1, autoriteit 100%

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

Antwoord 2, autoriteit 6%

U moet hier df.shiftgebruiken.
df.shift(i)verschuift het gehele dataframe met ieenheden naar beneden.

Dus, voor i = 1:

Invoer:

   x1   x2  
0  206  214  
1  226  234  
2  245  253  
3  265  272    
4  283  291

Uitvoer:

   x1   x2
0  Nan  Nan   
1  206  214  
2  226  234  
3  245  253  
4  265  272 

Dus, voer dit script uit om de verwachte output te krijgen:

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)

Antwoord 3, autoriteit 4%

Laten we het dataframe uit uw voorbeeld definiëren door

>>> 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

Dan zou je de index van de tweede kolom kunnen manipuleren door

>>> df[2].index = df[2].index+1

en tot slot de enkele kolommen opnieuw combineren

>>> 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

Misschien niet snel maar eenvoudig te lezen. Overweeg om variabelen in te stellen voor de kolomnamen en de daadwerkelijke benodigde shift.

Bewerken: Over het algemeen is verschuiving mogelijk door df[2].shift(1)zoals al gepost, maar zou de overdracht worden afgebroken.


Antwoord 4, autoriteit 3%

Als u de kolommen die u verschuiftaan het einde van uw dataframe niet wilt verliezen, voegt u eerst het vereiste nummer toe:

   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

Antwoord 5, autoriteit 2%

Ik veronderstel import

import pandas as pd
import numpy as np

Voeg eerst een nieuwe rij toe met NaN, NaN,...aan het einde van 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

Het zal een nieuwe DF df2 maken. Misschien is er een elegantere manier, maar dit werkt.

Nu kun je het verschuiven:

df2.x2 = df2.x2.shift(1)  # shift what you want

Antwoord 6

Ik probeerde een persoonlijk probleem op te lossen dat vergelijkbaar is met dat van jou, vond ik op Pandas Docwat volgens mij deze vraag zou beantwoorden:

DataFrame.shift(perioden=1, freq=Geen, as=0)
Verschuif de index met het gewenste aantal perioden met een optionele tijdfreq

Opmerkingen

Als freq is opgegeven, worden de indexwaarden verschoven, maar worden de gegevens niet opnieuw uitgelijnd. Dat wil zeggen, gebruik freq als u de index wilt uitbreiden bij het verschuiven en de originele gegevens wilt behouden.

Ik hoop toekomstige vragen in deze kwestie te helpen.


Antwoord 7

df3
    1   108.210 108.231
2   108.231 108.156
3   108.156 108.196
4   108.196 108.074
... ... ...
2495    108.351 108.279
2496    108.279 108.669
2497    108.669 108.687
2498    108.687 108.915
2499    108.915 108.852
df3['yo'] = df3['yo'].shift(-1)
    yo  price
0   108.231 108.210
1   108.156 108.231
2   108.196 108.156
3   108.074 108.196
4   108.104 108.074
... ... ...
2495    108.669 108.279
2496    108.687 108.669
2497    108.915 108.687
2498    108.852 108.915
2499    NaN 108.852

Antwoord 8

Dit is hoe ik het doe:

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)

In principe genereer ik een leeg dataframe met de gewenste index en voeg ik ze vervolgens samen. Maar ik zou dit graag als standaardfunctie in panda’s zien, dus ik heb een verbetering voorgesteld naar panda’s.


Antwoord 9

Ik ben nieuw bij panda’s en ik begrijp de vraag misschien niet, maar deze oplossing werkte voor mijn probleem:

# Shift contents of column 'x2' down 1 row
df['x2'] = df['x2'].shift()

Of om een ​​nieuwe kolom te maken met de inhoud van ‘x2’ 1 rij naar beneden verschoven

# Create new column with contents of 'x2'  shifted down 1 row
df['x3'] = df['x2'].shift()

Ik heb de officiële documenten voor shift() gelezen terwijl ik dit probeerde uit te zoeken, maar het is niet logisch voor mij en er zijn geen voorbeelden die verwijzen naar dit specifieke gedrag.

Houd er rekening mee dat de laatste rij van kolom ‘x2’ effectief van het einde van het dataframe wordt geduwd. Ik verwachtte dat shift() een vlag zou hebben om dit gedrag te veranderen, maar ik kan niets vinden.

Other episodes