上QQ阅读APP看书,第一时间看更新
4.4 位置计算
本节介绍几个经常到用的位置计算操作。diff()和shift()经常用来计算数据的增量变化,rank()用来生成数据的整体排名。
4.4.1 位置差值diff()
df.diff()可以做位移差操作,经常用来计算一个序列数据中上一个数据和下一个数据之间的差值,如增量研究。默认被减的数列下移一位,原数据在同位置上对移动后的数据相减,得到一个新的序列,第一位由于被减数下移,没有数据,所以结果为NaN。可以传入一个数值来规定移动多少位,负数代表移动方向相反。Series类型如果是非数字,会报错,DataFrame会对所有数字列移动计算,同时不允许有非数字类型列。
pd.Series([9, 4, 6, 7, 9]) ''' 0 9 1 4 2 6 3 7 4 9 dtype: int64 ''' # 后面与前面的差值 pd.Series([9, 4, 6, 7, 9]).diff() ''' 0 NaN 1 -5.0 2 2.0 3 1.0 4 2.0 dtype: float64 ''' # 后方向,移动两位求差值 pd.Series([9, 4, 6, 7, 9]).diff(-2) ''' 0 3.0 1 -3.0 2 -3.0 3 NaN 4 NaN dtype: float64 '''
对于DataFrame,还可以传入axis=1进行左右移动:
# 只筛选4个季度的5条数据 df.loc[:5,'Q1':'Q4'].diff(1, axis=1) ''' Q1 Q2 Q3 Q4 0 NaN -68.0 3.0 40.0 1 NaN 1.0 0.0 20.0 2 NaN 3.0 -42.0 66.0 3 NaN 3.0 -25.0 7.0 4 NaN -16.0 12.0 25.0 5 NaN -11.0 74.0 -44.0 '''
以上计算出了每个学生每个季度较前一个季度成绩的变化值。
4.4.2 位置移动shift()
shift()可以对数据进行移位,不做任何计算,也支持上下左右移动,移动后目标位置的类型无法接收的为NaN。
# 整体下移一行,最顶的一行为NaN df.shift() df.shift(3) # 移三行 # 整体上移一行,最底的一行为NaN df.Q1.head().shift(-1) # 向右移动一位 df.shift(axis=1) df.shift(3, axis=1) # 移三位 # 向左移动一位 df.shift(-1, axis=1) # 实现了df.Q1.diff() df.Q1 - df.Q1.shift()
4.4.3 位置序号rank()
rank()可以生成数据的排序值替换掉原来的数据值,它支持对所有类型数据进行排序,如英文会按字母顺序。使用rank()的典型例子有学生的成绩表,给出排名:
# 排名,将值变了序号 df.head().rank() ''' name team Q1 Q2 Q3 Q4 0 4.0 5.0 4.0 1.0 2.0 2.0 1 2.0 2.5 1.0 2.0 3.0 1.0 2 1.0 1.0 2.0 4.0 1.0 4.0 3 3.0 2.5 5.0 5.0 5.0 3.0 4 5.0 4.0 3.0 3.0 4.0 5.0 ''' # 横向排名 df.head().rank(axis=1) ''' Q1 Q2 Q3 Q4 0 4.0 1.0 2.0 3.0 1 1.0 2.5 2.5 4.0 2 2.0 3.0 1.0 4.0 3 3.0 4.0 1.0 2.0 4 3.0 1.0 2.0 4.0 '''
参数pct=True可以将序数转换成0到1的数,让我们知道数据所处的位置:
df.head().rank(pct=True) ''' name team Q1 Q2 Q3 Q4 0 0.8 1.0 0.8 0.2 0.4 0.4 1 0.4 0.5 0.2 0.4 0.6 0.2 2 0.2 0.2 0.4 0.8 0.2 0.8 3 0.6 0.5 1.0 1.0 1.0 0.6 4 1.0 0.8 0.6 0.6 0.8 1.0 '''
method参数指定的排序过程中遇到相同值的序数计算方法,可取的值有下面几个。
- average:序号的平均值,如并列第1名,则按二次元计算(1+2)/2,都显示1.5,下个数据的值为3。
- min:最小的序数,如并列第1名,则都显示1,下个数据为3。
- max:最大的序数,如并列第1名,则都显示1,下个数据为2。
- first:如并列第1名,则都显示1,下个数据为2。
- dense:按照索引的先后显示。
如果遇到空值,可以传入na_option='bottom',把空值放在最后,值为top放在前面。
4.4.4 小结
本节介绍了数据的位置移动相关计算方法,shift()移动位置,diff()计算移动后的差值,rank()将位置上的数据在本序列的序号计算出来。