在使用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