diff()和shift()经常用来计算数据的增量变化,rank()用来生成数据的整体排名
位置差值 diff()
df.diff() 可以做位移差操作,经常用来计算一个序列数据中上一个数据和下一个数据之间的差值,如增量研究。默认被减的数列下一位,原位置在同位置上对移动后的数据相减。得到一个新的序列,第一位由于被减数下移,没有数据(结果为NaN)。可以传入一个数值来设定需要移动多少位。
DataFrame会对所有数字列移动计算,同时不允许有非数字类型列。
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,进行左右移动
df.loc[:,['total_bill','tip']].head().diff(axis=1)
# total_bill tip
# sex
# Female NaN -15.98
# Male NaN -8.68
# Male NaN -17.51
# Male NaN -20.37
# Female NaN -20.98
## 移动位置
shift()可以对数据进行位移,不做任何计算,也支持上下左右移动,移动后的目标位置的类型无法接收的为NaN
# 整体下移一行,最顶的一行为NaN
df.shift()
df.shift(3) # 移三行
df.Q1.head().shift(-1) # Q1列取前5,再上移一行
# 向右移动一位
df.shift(axis=1)
df.shift(3,axis=1) # 动三位
df.shift(-1,axis=1) # 向左移动一位
# 实现了df.Q1.diff()
df.Q1-df.Q1.shift()
位置序号rank()
rank()可以生成数据的排序值替换掉原来的数据值,支持所有数据类型排序
df.head().rank()
# total_bill tip smoker day time size
# sex
# Female 2.0 1.0 3.0 3.0 3.0 1.5
# Male 1.0 2.0 3.0 3.0 3.0 3.5
# Male 3.0 4.0 3.0 3.0 3.0 3.5
# Male 4.0 3.0 3.0 3.0 3.0 1.5
# Female 5.0 5.0 3.0 3.0 3.0 5.0
参数pct=True 可以将序数转换成0到1的数,从而知道数据所处的位置
df.head().rank(pct=True)
# total_bill tip smoker day time size
# sex
# Female 0.4 0.2 0.6 0.6 0.6 0.3
# Male 0.2 0.4 0.6 0.6 0.6 0.7
# Male 0.6 0.8 0.6 0.6 0.6 0.7
# Male 0.8 0.6 0.6 0.6 0.6 0.3
# Female 1.0 1.0 0.6 0.6 0.6 1.0
method参数,指定排序过程中遇到相同值得序号计算方法,取值有下面几个:
- average:序号的平均值,如并列第1名,则按照二次元计算(1+2)/2,都显示1.5,下个数据的值是3
- min:最小的序号,如并列第一名,则都显示1,下个数据为3
- max:最大的序号,如并列第一名,则都显示1,下个数据为2
- first:如并列第一名,按照索引的先后显示
- dense:如并列第一名,都显示1,下个数据为2
如果遇到空值,可以传入na_option=‘bottom’,把空值放到最后,值为top放前面