Pandas DataFrame'de bir sütun nasıl kaydırılır


102

Bir Pandas'taki bir sütunu kaydırmak istiyorum DataFrame, ancak tüm DF'yi yeniden yazmadan bunu belgelerden yapmak için bir yöntem bulamadım. Bunun nasıl yapıldığını bilen var m? Veri çerçevesi:

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

Istenilen çıktı:

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

3
bu gerçekten vardiya işlevi için isteğe bağlı bir bayrak olmalı
KIC

Yanıtlar:


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

9
Sonuç ## 5 eksik. Pandalarda vardiya kullanırken dizini genişletmenin kolay bir yolu var mı?
Waylon Walker

@WaylonWalker Buna uyuşuk yuvarlanma denir:df['x2'] = np.roll(df['x2'], 1)
ayhan

1
Bunu çözen oldu mu? # 5 hala kayıp
Kritz

100 sütunu aynı şekilde kaydırmam gerekiyor, nasıl for döngüsü yapabilirim?
Vincent Roye

2
@Johan, kaydırmadan önce sonuna boş bir satır eklemeyi denediniz mi?
MikeyE

8

df.shiftBurayı kullanmanız gerekiyor.
df.shift(i)tüm veri çerçevesini ibirimler aşağı kaydırır .

Yani i = 1:

Giriş:

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

Çıktı:

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

Bu nedenle, beklenen çıktıyı elde etmek için bu betiği çalıştırın:

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)

3
Stackoverflow'a hoş geldiniz. Nasıl kullanılması gerektiğine dair bir açıklama yaparsanız cevabınız daha faydalı olacaktır.
Simon.SA

2
yine OP'nin açıkça istediği 5. sırayı kaybettiniz
KIC

6

Örneğinizdeki veri çerçevesini şu şekilde tanımlayalım:

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

Sonra ikinci sütunun dizinini şu şekilde değiştirebilirsiniz:

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

ve son olarak tek sütunları yeniden birleştirin

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

Belki hızlı değil ama okuması kolay. Sütun adları için değişkenler ve gereken gerçek kayma ayarlamayı düşünün.

Düzenleme: Genel olarak vites değiştirme, df[2].shift(1)zaten yayınlandığı gibi mümkündür, ancak bu, taşımayı keser.


Bunu yapmanın hızlı bir yolu olup olmadığını merak ediyorum ve bir tarih dizini kullanarak, Esasen serimizi kesmeden değiştirmek istiyorsunuz ve bu nedenle ek dizin değerlerini belirlemelisiniz. bir vardiya için, series.shift (-1, dolgu = [tarihsaat (<bir tarih>)]) gibi bir şey söylersiniz. Böyle bir şey mümkün mü? Ah burada buldum stackoverflow.com/questions/36042804/…
OldSchool

5

Veri çerçevenizin sonuna kaydırdığınız sütunları kaybetmek istemiyorsanız , önce gerekli sayıyı ekleyin:

    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

3

Sanırım ithalat

import pandas as pd
import numpy as np

Önce NaN, NaN,...DataFrame'in ( df) sonuna yeni bir satır ekleyin .

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

Yeni DF df2 oluşturacaktır. Belki daha zarif bir yol vardır ama bu işe yarar.

Şimdi onu değiştirebilirsiniz:

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

2

Kişisel bir soruna cevap vermeye çalışırken ve sizinkine benzer şekilde Pandas Doc'ta bu soruyu cevaplayacağını düşündüğüm şeyi buldum:

DataFrame.shift (nokta = 1, frekans = Yok, eksen = 0) İsteğe bağlı bir zaman frekansı ile dizini istenen dönem sayısına göre kaydır

Notlar

Frekans belirtilirse, dizin değerleri kaydırılır, ancak veriler yeniden hizalanmaz. Yani, orijinal verileri değiştirirken ve korurken dizini genişletmek istiyorsanız freq kullanın.

Bu konuyla ilgili gelecekteki sorulara yardımcı olmayı umuyoruz.


0

Ben böyle yaparım:

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)

Temel olarak, istenen dizine sahip boş bir veri çerçevesi oluşturuyorum ve sonra bunları bir araya getiriyorum. Ama bunu gerçekten pandalarda standart bir özellik olarak görmek isterim, bu yüzden pandalara bir geliştirme önerdim .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.