深入浅出Pandas:利用Python进行数据处理与分析
上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()将位置上的数据在本序列的序号计算出来。