Cara menggeser kolom di Pandas DataFrame

101

Saya ingin menggeser kolom dalam Pandas DataFrame, tetapi saya belum dapat menemukan metode untuk melakukannya dari dokumentasi tanpa menulis ulang seluruh DF. Apakah ada yang tahu bagaimana melakukannya? DataFrame:

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

Output yang diinginkan:

##    x1   x2
##0  206  nan
##1  226  214
##2  245  234
##3  265  253
##4  283  272
##5  nan  291
akar
sumber
3
ini harus benar-benar menjadi flag opsional untuk fungsi shift
KIC

Jawaban:

156
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
eumiro
sumber
9
Hasilnya hilang ## 5. Apakah ada cara mudah pada panda untuk memperpanjang indeks saat menggunakan shift?
Waylon Walker
@WaylonWalker Itu disebut bergulir di numpy:df['x2'] = np.roll(df['x2'], 1)
ayhan
1
Apakah ada yang tahu ini? # 5 masih hilang
Kritz
Saya harus menggeser 100 kolom dengan cara yang sama, bagaimana cara membuat loop for?
Vincent Roye
2
@Johan apakah Anda mencoba menambahkan baris kosong di akhir sebelum Anda menggesernya?
MikeyE
8

Anda perlu menggunakan di df.shiftsini.
df.shift(i)menggeser seluruh kerangka data dengan iunit ke bawah.

Jadi, untuk i = 1:

Memasukkan:

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

Keluaran:

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

Jadi, jalankan skrip ini untuk mendapatkan hasil yang diharapkan:

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)
Ayush Jain
sumber
3
Selamat datang di stackoverflow. Jawaban Anda akan lebih membantu jika Anda memberikan penjelasan bagaimana seharusnya digunakan.
Simon.SA
1
sekali lagi Anda telah kehilangan satu baris # 5 yang jelas diinginkan OP
KIC
6

Mari tentukan kerangka data dari contoh Anda dengan

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

Kemudian Anda dapat memanipulasi indeks kolom kedua dengan

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

dan terakhir menggabungkan kembali satu kolom

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

Mungkin tidak cepat tapi mudah dibaca. Pertimbangkan untuk mengatur variabel untuk nama kolom dan shift aktual yang diperlukan.

Sunting: Pergeseran secara umum dimungkinkan oleh df[2].shift(1)seperti yang telah diposting tetapi apakah itu memotong sisa.

Kay Wittig
sumber
Saya ingin tahu apakah ada cara cepat untuk melakukan ini, dan menggunakan indeks tanggal, Pada dasarnya Anda ingin menggeser tanpa memotong rangkaian kami, dan dengan demikian Anda harus menentukan nilai indeks tambahan. untuk shift per satu, Anda akan mengatakan sesuatu seperti series.shift (-1, fill = [datetime (<some date>)]). Apakah hal seperti ini mungkin? Ah menemukannya di sini stackoverflow.com/questions/36042804/…
OldSchool
5

Jika Anda tidak ingin kehilangan kolom yang Anda geser melewati akhir kerangka data Anda, cukup tambahkan nomor yang diperlukan terlebih dahulu:

    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
David Ferris
sumber
3

Saya kira impor

import pandas as pd
import numpy as np

Pertama tambahkan baris baru dengan NaN, NaN,...di akhir 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

Ini akan membuat DF df2 baru. Mungkin ada cara yang lebih elegan tapi ini berhasil.

Sekarang Anda bisa menggesernya:

df2.x2 = df2.x2.shift(1)  # shift what you want
martin-voj
sumber
2

Mencoba menjawab masalah pribadi dan serupa dengan masalah Anda, saya menemukan di Pandas Doc apa yang menurut saya akan menjawab pertanyaan ini:

DataFrame.shift (titik = 1, frekuensi = Tidak ada, sumbu = 0) Geser indeks menurut jumlah periode yang diinginkan dengan frekuensi waktu opsional

Catatan

Jika freq ditentukan maka nilai indeks bergeser tetapi data tidak diselaraskan. Artinya, gunakan freq jika Anda ingin memperpanjang indeks saat menggeser dan mempertahankan data asli.

Harapan untuk membantu pertanyaan masa depan dalam masalah ini.

Tha_franklin
sumber
0

Inilah cara saya melakukannya:

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)

Pada dasarnya saya membuat dataframe kosong dengan indeks yang diinginkan dan kemudian menggabungkannya. Tetapi saya sangat ingin melihat ini sebagai fitur standar pada panda, jadi saya telah mengusulkan peningkatan pada panda.

KIC
sumber