當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python Pandas DataFrame shift方法用法及代碼示例


Pandas DataFrame.shift(~) 方法將行或列移動指定的量,而不更改 DataFrame 的大小。

注意

使用此方法有利於 tshift(~) ,因為 tshift(~) 現已棄用。

參數

1. periods | int

要移動的量。如果axis=0(默認值),則正整數表示行向下移動,而負整數表示行向上移動。相同的邏輯適用於axis=1(列移位)。

2. freq | stringDataOffsettseries.offsetstimedelta | optional

如果指定,則將移動日期索引而不是行/列。僅當源 DataFrame 的索引是 DatetimeIndex 時,這才相關。請查看下麵的示例以進行說明。

3. axis | intstring | optional

是否移動行或列:

說明

0"index"

行將被移動。

1"columns"

列將被移動。

默認情況下,axis=0

4. fill_value | object | optional

用於填充新移動的行/列的值。默認 fill_value 取決於列的數據類型:

  • 對於 date-related 類型,fill_value=NaT

  • 否則,fill_value=NaN

返回值

索引、行或列已移動的新 DataFrame

例子

考慮以下 DataFrame :

df = pd.DataFrame({"A":["a","b","c","d"],"B":["e","f","g","h"],"C":["i","j","k","l"]})
df



   A  B  C
0  a  e  i
1  b  f  j
2  c  g  k
3  d  h  l

基本用法

向下移動 2 行:

df.shift(2)



   A    B    C
0  NaN  NaN  NaN
1  NaN  NaN  NaN
2  a    e    i
3  b    f    j

向上移動 2 行:

df.shift(-2)



   A    B    C
0  c    g    k
1  d    h    l
2  NaN  NaN  NaN
3  NaN  NaN  NaN

請注意索引沒有移動,即索引仍然是 [0,1,2,3]

移動列

默認情況下, axis=0 ,這意味著行發生移位。要移動列,請像這樣傳遞axis=1

df.shift(2, axis=1)



   A    B    C
0  NaN  NaN  a
1  NaN  NaN  b
2  NaN  NaN  c
3  NaN  NaN  d

再次注意列值的變化,但不注意列標簽的變化。

指定fill_value

我們可以指定我們自己的填充值,而不是使用默認的 NaN 填充,如下所示:

df.shift(fill_value=0)



   A  B  C
0  0  0  0
1  0  0  0
2  a  e  i
3  b  f  j

指定頻率

當 DataFrame 是時間序列時,freq 參數發揮作用。

為了進行演示,請考慮以下時間序列 DataFrame:

index_date = pd.date_range("2020-12-25", periods=4, freq="D")
df = pd.DataFrame({"A":["a","b","c","d"],"B":["e","f","g","h"],"C":["i","j","k","l"]}, index=index_date)
df



            A  B  C
2020-12-25  a  e  i
2020-12-26  b  f  j
2020-12-27  c  g  k
2020-12-28  d  h  l

要將索引移動 3 天:

df.shift(freq="3D")



            A  B  C
2020-12-28  a  e  i
2020-12-29  b  f  j
2020-12-30  c  g  k
2020-12-31  d  h  l

請注意索引中的日期已移動 3 天,但值(例如 ab 等)根本沒有移動。

您還可以組合 periodfreq 。要將索引移動 2*3=6 days

df.shift(2, freq="3D")



            A  B  C
2020-12-31  a  e  i
2021-01-01  b  f  j
2021-01-02  c  g  k
2021-01-03  d  h  l

不直觀的行為

考慮以下 DataFrame :

index_date = pd.date_range("2020-12-29", periods=4, freq="D")
df = pd.DataFrame({"A":["a","b","c","d"],"B":["e","f","g","h"],"C":["i","j","k","l"]}, index=index_date)
df



            A  B  C
2020-12-29  a  e  i
2020-12-30  b  f  j
2020-12-31  c  g  k
2021-01-01  d  h  l

設置 freq="M" 會產生:

df.shift(periods=1, freq="M")



            A  B  C
2020-12-31  a  e  i
2020-12-31  b  f  j
2021-01-31  c  g  k
2021-01-31  d  h  l

結果有點不直觀,因為我們期望將 one-month 偏移量應用於每個日期索引。

請注意以下事項:

  • 每個日期索引都轉移到月底。

  • 由於我們指定了 freq="M" ,因此日期索引的日單位變得無關緊要。

  • 例外情況是當日單位位於月末時(例如 12-31 ),在這種情況下,月份將發生偏移(例如 01-31 )。

相關用法


注:本文由純淨天空篩選整理自Isshin Inada大神的英文原創作品 Pandas DataFrame | shift method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。