pandas中shift和diff函数关系

通过?pandas.DataFrame.shift命令查看帮助文档

[python]  view plain  copy
  1. Signature: pandas.DataFrame.shift(self, periods=1, freq=None, axis=0)  
  2. Docstring:  
  3. Shift index by desired number of periods with an optional time freq  
该函数主要的功能就是使数据框中的数据移动,若freq=None时,根据axis的设置,行索引数据保持不变,列索引数据可以在行上上下移动或在列上左右移动;若行索引为时间序列,则可以设置freq参数,根据periods和freq参数值组合,使行索引每次发生periods*freq偏移量滚动,列索引数据不会移动

①对于DataFrame的行索引是日期型,行索引发生移动,列索引数据不变

[python]  view plain  copy
  1. In [2]: import pandas as pd  
  2.    ...: import numpy as np  
  3.    ...: df = pd.DataFrame(np.arange(24).reshape(6,4),index=pd.date_range(start=  
  4.    ...: '20170101',periods=6),columns=['A','B','C','D'])  
  5.    ...: df  
  6.    ...:  
  7. Out[2]:  
  8.              A   B   C   D  
  9. 2017-01-01   0   1   2   3  
  10. 2017-01-02   4   5   6   7  
  11. 2017-01-03   8   9  10  11  
  12. 2017-01-04  12  13  14  15  
  13. 2017-01-05  16  17  18  19  
  14. 2017-01-06  20  21  22  23  
  15.   
  16. In [3]: df.shift(2,axis=0,freq='2D')  
  17. Out[3]:  
  18.              A   B   C   D  
  19. 2017-01-05   0   1   2   3  
  20. 2017-01-06   4   5   6   7  
  21. 2017-01-07   8   9  10  11  
  22. 2017-01-08  12  13  14  15  
  23. 2017-01-09  16  17  18  19  
  24. 2017-01-10  20  21  22  23  
  25.   
  26. In [4]: df.shift(2,axis=1,freq='2D')  
  27. Out[4]:  
  28.              A   B   C   D  
  29. 2017-01-05   0   1   2   3  
  30. 2017-01-06   4   5   6   7  
  31. 2017-01-07   8   9  10  11  
  32. 2017-01-08  12  13  14  15  
  33. 2017-01-09  16  17  18  19  
  34. 2017-01-10  20  21  22  23  
  35.   
  36. In [5]: df.shift(2,freq='2D')  
  37. Out[5]:  
  38.              A   B   C   D  
  39. 2017-01-05   0   1   2   3  
  40. 2017-01-06   4   5   6   7  
  41. 2017-01-07   8   9  10  11  
  42. 2017-01-08  12  13  14  15  
  43. 2017-01-09  16  17  18  19  
  44. 2017-01-10  20  21  22  23  
结论:对于时间索引而言,shift使时间索引发生移动,其他数据保存原样,且axis设置没有任何影响

②对于DataFrame行索引为非时间序列,行索引数据保持不变,列索引数据发生移动

[python]  view plain  copy
  1. In [6]: import pandas as pd  
  2.    ...: import numpy as np  
  3.    ...: df = pd.DataFrame(np.arange(24).reshape(6,4),index=['r1','r2','r3','r4'  
  4.    ...: ,'r5','r6'],columns=['A','B','C','D'])  
  5.    ...: df  
  6.    ...:  
  7. Out[6]:  
  8.      A   B   C   D  
  9. r1   0   1   2   3  
  10. r2   4   5   6   7  
  11. r3   8   9  10  11  
  12. r4  12  13  14  15  
  13. r5  16  17  18  19  
  14. r6  20  21  22  23  
  15.   
  16. In [7]: df.shift(periods=2,axis=0)  
  17. Out[7]:  
  18.        A     B     C     D  
  19. r1   NaN   NaN   NaN   NaN  
  20. r2   NaN   NaN   NaN   NaN  
  21. r3   0.0   1.0   2.0   3.0  
  22. r4   4.0   5.0   6.0   7.0  
  23. r5   8.0   9.0  10.0  11.0  
  24. r6  12.0  13.0  14.0  15.0  
  25.   
  26. In [8]: df.shift(periods=-2,axis=0)  
  27. Out[8]:  
  28.        A     B     C     D  
  29. r1   8.0   9.0  10.0  11.0  
  30. r2  12.0  13.0  14.0  15.0  
  31. r3  16.0  17.0  18.0  19.0  
  32. r4  20.0  21.0  22.0  23.0  
  33. r5   NaN   NaN   NaN   NaN  
  34. r6   NaN   NaN   NaN   NaN  
  35.   
  36. In [9]: df.shift(periods=2,axis=1)  
  37. Out[9]:  
  38.      A   B     C     D  
  39. r1 NaN NaN   0.0   1.0  
  40. r2 NaN NaN   4.0   5.0  
  41. r3 NaN NaN   8.0   9.0  
  42. r4 NaN NaN  12.0  13.0  
  43. r5 NaN NaN  16.0  17.0  
  44. r6 NaN NaN  20.0  21.0  
  45.   
  46. In [10]: df.shift(periods=-2,axis=1)  
  47. Out[10]:  
  48.        A     B   C   D  
  49. r1   2.0   3.0 NaN NaN  
  50. r2   6.0   7.0 NaN NaN  
  51. r3  10.0  11.0 NaN NaN  
  52. r4  14.0  15.0 NaN NaN  
  53. r5  18.0  19.0 NaN NaN  
  54. r6  22.0  23.0 NaN NaN  
通过?pandas.DataFrame.diff命令查看帮助文档,发现和shift函数形式一样

[python]  view plain  copy
  1. Signature: pd.DataFrame.diff(self, periods=1, axis=0)  
  2. Docstring:  
  3. 1st discrete difference of object  

下面看看diff函数和shift函数之间的关系

[python]  view plain  copy
  1. In [13]: df.diff(periods=2,axis=0)  
  2. Out[13]:  
  3.       A    B    C    D  
  4. r1  NaN  NaN  NaN  NaN  
  5. r2  NaN  NaN  NaN  NaN  
  6. r3  8.0  8.0  8.0  8.0  
  7. r4  8.0  8.0  8.0  8.0  
  8. r5  8.0  8.0  8.0  8.0  
  9. r6  8.0  8.0  8.0  8.0  
  10.   
  11. In [14]: df -df.diff(periods=2,axis=0)  
  12. Out[14]:  
  13.        A     B     C     D  
  14. r1   NaN   NaN   NaN   NaN  
  15. r2   NaN   NaN   NaN   NaN  
  16. r3   0.0   1.0   2.0   3.0  
  17. r4   4.0   5.0   6.0   7.0  
  18. r5   8.0   9.0  10.0  11.0  
  19. r6  12.0  13.0  14.0  15.0  
  20.   
  21. In [15]: df.shift(periods=2,axis=0)  
  22. Out[15]:  
  23.        A     B     C     D  
  24. r1   NaN   NaN   NaN   NaN  
  25. r2   NaN   NaN   NaN   NaN  
  26. r3   0.0   1.0   2.0   3.0  
  27. r4   4.0   5.0   6.0   7.0  
  28. r5   8.0   9.0  10.0  11.0  
  29. r6  12.0  13.0  14.0  15.0  

猜你喜欢

转载自blog.csdn.net/aaronpaul/article/details/80708438