当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。