Ik zou graag een kolom in een Pandas DataFrame
willen 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.shift
gebruiken.
df.shift(i)
verschuift het gehele dataframe met i
eenheden 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 tijdfreqOpmerkingen
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.