深入解析pandas中shift与diff函数的核心区别与联系
本文详细解析pandas中shift和diff函数的功能与区别。shift用于数据框索引或数据的滚动偏移,支持时间频率设置;diff计算离散差分。通过代码示例展示两者在时间索引与非时间索引下的表现,并揭示diff本质上是当前值与shift后值的差,帮助开发者准确使用这两个关键数据处理工具。
首先,可以通过执行?pandas.DataFrame.shift命令来查看该函数的官方帮助文档,以获取详细的参数说明和使用示例。
Signature: pandas.DataFrame.shift(self, periods=1, freq=None, axis=0) Docstring: Shift index by desired number of periods with an optional time freq
该函数的核心作用是实现数据框中数据的位移操作。当freq参数为None时,位移行为取决于axis参数的设置:若axis为0(默认),行索引保持不变,列数据在垂直方向上发生上下移动;若axis为1,则列索引保持不变,行数据在水平方向上发生左右移动。此外,如果行索引被设定为时间序列类型,则可以指定freq参数。此时,系统会根据periods和freq参数的组合,使行索引按照periods*freq的偏移量进行滚动,而列索引对应的数据内容本身不会发生位移。
第一种情况:当DataFrame的行索引为日期类型时,执行shift操作会导致行索引发生移动,而列索引所对应的具体数据值保持原样不变。
In [2]: import pandas as pd
...: import numpy as np
...: df = pd.DataFrame(np.arange(24).reshape(6,4),index=pd.date_range(start=
...: '20170101',periods=6),columns=['A','B','C','D'])
...: df
...:
Out[2]:
A B C D
2017-01-01 0 1 2 3
2017-01-02 4 5 6 7
2017-01-03 8 9 10 11
2017-01-04 12 13 14 15
2017-01-05 16 17 18 19
2017-01-06 20 21 22 23
In [3]: df.shift(2,axis=0,freq='2D')
Out[3]:
A B C D
2017-01-05 0 1 2 3
2017-01-06 4 5 6 7
2017-01-07 8 9 10 11
2017-01-08 12 13 14 15
2017-01-09 16 17 18 19
2017-01-10 20 21 22 23
In [4]: df.shift(2,axis=1,freq='2D')
Out[4]:
A B C D
2017-01-05 0 1 2 3
2017-01-06 4 5 6 7
2017-01-07 8 9 10 11
2017-01-08 12 13 14 15
2017-01-09 16 17 18 19
2017-01-10 20 21 22 23
In [5]: df.shift(2,freq='2D')
Out[5]:
A B C D
2017-01-05 0 1 2 3
2017-01-06 4 5 6 7
2017-01-07 8 9 10 11
2017-01-08 12 13 14 15
2017-01-09 16 17 18 19
2017-01-10 20 21 22 23
结论:针对时间索引的情况,shift函数的主要效果是移动时间索引本身,其他数据内容保持原始状态。此时,无论axis参数如何设置,均对数据内容的位移没有影响,仅作用于索引的滚动。
第二种情况:当DataFrame的行索引为非时间序列(如普通字符串或整数)时,行索引数据保持不变,而列索引对应的数据会发生实际的上下或左右移动。
In [6]: import pandas as pd
...: import numpy as np
...: df = pd.DataFrame(np.arange(24).reshape(6,4),index=['r1','r2','r3','r4'
...: ,'r5','r6'],columns=['A','B','C','D'])
...: df
...:
Out[6]:
A B C D
r1 0 1 2 3
r2 4 5 6 7
r3 8 9 10 11
r4 12 13 14 15
r5 16 17 18 19
r6 20 21 22 23
In [7]: df.shift(periods=2,axis=0)
Out[7]:
A B C D
r1 NaN NaN NaN NaN
r2 NaN NaN NaN NaN
r3 0.0 1.0 2.0 3.0
r4 4.0 5.0 6.0 7.0
r5 8.0 9.0 10.0 11.0
r6 12.0 13.0 14.0 15.0
In [8]: df.shift(periods=-2,axis=0)
Out[8]:
A B C D
r1 8.0 9.0 10.0 11.0
r2 12.0 13.0 14.0 15.0
r3 16.0 17.0 18.0 19.0
r4 20.0 21.0 22.0 23.0
r5 NaN NaN NaN NaN
r6 NaN NaN NaN NaN
In [9]: df.shift(periods=2,axis=1)
Out[9]:
A B C D
r1 NaN NaN 0.0 1.0
r2 NaN NaN 4.0 5.0
r3 NaN NaN 8.0 9.0
r4 NaN NaN 12.0 13.0
r5 NaN NaN 16.0 17.0
r6 NaN NaN 20.0 21.0
In [10]: df.shift(periods=-2,axis=1)
Out[10]:
A B C D
r1 2.0 3.0 NaN NaN
r2 6.0 7.0 NaN NaN
r3 10.0 11.0 NaN NaN
r4 14.0 15.0 NaN NaN
r5 18.0 19.0 NaN NaN
r6 22.0 23.0 NaN NaN
接下来,通过执行?pandas.DataFrame.diff命令查看其帮助文档,可以发现diff函数的参数形式与shift函数非常相似,两者在接口设计上具有高度的一致性。
Signature: pd.DataFrame.diff(self, periods=1, axis=0) Docstring: 1st discrete difference of object
下面通过具体的代码示例,深入分析diff函数与shift函数之间的内在联系。
In [13]: df.diff(periods=2,axis=0)
Out[13]:
A B C D
r1 NaN NaN NaN NaN
r2 NaN NaN NaN NaN
r3 8.0 8.0 8.0 8.0
r4 8.0 8.0 8.0 8.0
r5 8.0 8.0 8.0 8.0
r6 8.0 8.0 8.0 8.0
In [14]: df -df.diff(periods=2,axis=0)
Out[14]:
A B C D
r1 NaN NaN NaN NaN
r2 NaN NaN NaN NaN
r3 0.0 1.0 2.0 3.0
r4 4.0 5.0 6.0 7.0
r5 8.0 9.0 10.0 11.0
r6 12.0 13.0 14.0 15.0
In [15]: df.shift(periods=2,axis=0)
Out[15]:
A B C D
r1 NaN NaN NaN NaN
r2 NaN NaN NaN NaN
r3 0.0 1.0 2.0 3.0
r4 4.0 5.0 6.0 7.0
r5 8.0 9.0 10.0 11.0
r6 12.0 13.0 14.0 15.0
以上关于pandas中shift和diff函数关系的解析就是本文的全部内容,希望能为读者提供有价值的参考。如果大家觉得有帮助,欢迎继续支持本站获取更多技术分享。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













