在使用Pandas的过程中,有时会遇到shift函数,今天就一起来彻底学习下。先来看看帮助文档是怎么说的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
>>> import pandas
>>> help (pandas.DataFrame.shift)
Help on function shift in module pandas.core.frame:
shift( self , periods = 1 , freq = None , axis = 0 )
Shift index by desired number of periods with an optional time freq
Parameters
- - - - - - - - - -
periods : int
Number of periods to move, can be positive or negative
freq : DateOffset, timedelta, or time rule string, optional
Increment to use from the tseries module or time rule (e.g. 'EOM' ).
See Notes.
axis : { 0 or 'index' , 1 or 'columns' }
Notes
- - - - -
If freq is specified then the index values are shifted but the data
is not realigned. That is , use freq if you would like to extend the
index when shifting and preserve the original data.
Returns
- - - - - - -
shifted : DataFrame
|
该函数主要的功能就是使数据框中的数据移动,若freq=None时,根据axis的设置,行索引数据保持不变,列索引数据可以在行上上下移动或在列上左右移动;若行索引为时间序列,则可以设置freq参数,根据periods和freq参数值组合,使行索引每次发生periods*freq偏移量滚动,列索引数据不会移动。
参数详解:
- period:表示移动的幅度,可以是正数,也可以是负数,默认值是1,1就表示移动一次,注意这里移动的都是数据,而索引是不移动的,移动之后没有对应值的,就赋值为NaN。
- freq: DateOffset, timedelta, or time rule string,可选参数,默认值为None,只适用于时间序列,如果这个参数存在,那么会按照参数值移动时间索引,而数据值没有发生变化。
- axis: {0, 1, ‘index', ‘columns'},表示移动的方向,如果是0或者'index'表示上下移动,如果是1或者'columns',则会左右移动。
先来看一下一些简单的示例:
1、非时间索引下period的设置
假设存在一个DataFrame数据df:
1
2
3
4
5
|
index value1
A 0
B 1
C 2
D 3
|
如果执行以下代码 df.shift() 就会变成如下:
1
2
3
4
5
|
index value1
A NaN
B 0
C 1
D 2
|
执行 df.shift(2) 就会得到:
1
2
3
4
5
|
index value1
A NaN
B NaN
C 0
D 1
|
执行 df.shift(-1) 会得到:
1
2
3
4
5
|
index value1
A 1
B 2
C 3
D NaN
|
注意,shift移动的是整个数据,如果df有如下多列数据:
1
2
3
4
5
|
AA BB CC DD
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
|
执行 df.shift(2) 的数据为:
1
2
3
4
5
|
AA BB CC DD
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c 0.0 1.0 2.0 3.0
d 4.0 5.0 6.0 7.0
|
如果只想移动df中的某一列数据,则需要这样操作: df['DD']= df['DD'].shift(1)
执行后的数据为:
1
2
3
4
5
|
AA BB CC DD
a 0 1 2 NaN
b 4 5 6 NaN
c 8 9 10 11
d 12 13 14 15
|
2、时间索引下freq 参数设置
假设存在如下DataFrame的df:
1
|
df = pd.DataFrame(np.arange( 16 ).reshape( 4 , 4 ),columns = [ 'AA' , 'BB' , 'CC' , 'DD' ],index = pd.date_range( '2012-06-01' , '2012-06-04' ))
|
1
2
3
4
5
|
AA BB CC DD
2012 - 06 - 01 0 1 2 3
2012 - 06 - 02 4 5 6 7
2012 - 06 - 03 8 9 10 11
2012 - 06 - 04 12 13 14 15
|
执行 df.shift(freq=datetime.timedelta(1)) 后:
1
2
3
4
5
|
AA BB CC DD
2012 - 06 - 02 0 1 2 3
2012 - 06 - 03 4 5 6 7
2012 - 06 - 04 8 9 10 11
2012 - 06 - 05 12 13 14 15
|
执行 df.shift(freq=datetime.timedelta(-2)) 后:
1
2
3
4
5
|
AA BB CC DD
2012 - 05 - 30 0 1 2 3
2012 - 05 - 31 4 5 6 7
2012 - 06 - 01 8 9 10 11
2012 - 06 - 02 12 13 14 15
|
可以看到索引直接变了。
3、axis轴向设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
df = pd.DataFrame(np.arange( 16 ).reshape( 4 , 4 ),columns = [ 'AA' , 'BB' , 'CC' , 'DD' ],index = [ 'a' , 'b' , 'c' , 'd' ])
df
Out[ 1 ]:
AA BB CC DD
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
#当period为正时,默认是axis = 0轴的设定,向下移动
df.shift( 2 )
Out[ 2 ]:
AA BB CC DD
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c 0.0 1.0 2.0 3.0
d 4.0 5.0 6.0 7.0
#当axis=1,沿水平方向进行移动,正数向右移,负数向左移
df.shift( 2 ,axis = 1 )
Out[ 3 ]:
AA BB CC DD
a NaN NaN 0.0 1.0
b NaN NaN 4.0 5.0
c NaN NaN 8.0 9.0
d NaN NaN 12.0 13.0
#当period为负时,默认是axis = 0轴的设定,向上移动
df.shift( - 1 )
Out[ 4 ]:
AA BB CC DD
a 4.0 5.0 6.0 7.0
b 8.0 9.0 10.0 11.0
c 12.0 13.0 14.0 15.0
d NaN NaN NaN NaN
|
pandas 中上下两行相减(隔行相减) -- shift函数的使用
最近使用pandas处理数据,需求是想相邻两行上下相减,查API发现shift函数,很灵活,。你也可以隔任意行相减。
1
|
p[ 'xx_1' ] = p[ "xx" ].shift( 1 )
|
上面得到的就是xx字段向下移动一行的结果,和之前相比向下移动一行,你可以设置为任意行,也可是向上向下
1
|
p[ 'xx' ] - p[ "xx_1" ]
|
这就是前后两行的差值,很方便,Pandas很强大
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://www.biaodianfu.com/pandas-shift.html