pandas(6):数学统计2
除了对原始数据进行简单的统计计算外,有时候我们还需要对数据进行一定变化再做计算。pandas自带一些基础函数支持这些变化。源Excel文件maths_pro.xlsx:
一、位移增量df.diff()和位移操作df.shift()
①df.shift()
df.shift(periods=1, freq=None, axis=0)
参数说明:
- periods:int,表示移动的幅度,正数或负数,默认值是1。注意这里移动的都是数据,而索引是不移动的,移动之后没有对应值的,就赋值为NaN。
- axis:{0, 1, ‘index’, ‘columns’},表示移动的方向,如果是0或者’index’表示上下移动,如果是1或者’columns’,则会左右移动。
- freq,DateOffset, timedelta, or time rule string,可选参数,默认值为None,只适用于时间序列,如果这个参数存在,那么会按照参数值移动时间索引(索引有很多种类型),而数据值没有发生变化。
df = pd.read_excel(r'C:/Users/asus/Desktop/Python/maths_pro.xlsx')
df
df.shift() # 默认数据向下偏移一个单位
# 设置轴向,向右偏移一个单位,数据类型不匹配,也会设置为NaN值
df.shift(axis=1)
df.shift(periods=-2) # 向上偏移两个单位
②df.diff()
df.diff(periods=1, axis=0)
做位移差操作(不仅位移而且还做了减操作)。用在一个序列性数据中上一个数据和下一个数据之前的差值,增量计算。
df['语文'].diff()
# 等价
df['语文']-df['语文'].shift()
二、排名计算df.rank()
参考文章:https://zhuanlan.zhihu.com/p/87593543(分组排名)
df.rank(axis=0, method='average', numeric_only=None,
na_option='keep', ascending=True, pct=False)
功能:沿着某个轴(0或者1)计算对象的排名
返回值:以Series或者DataFrame的类型返回数据的排名(哪个类型调用返回哪个类型)
参数说明:
- axis:设置沿着哪个轴计算排名(0或者1)
- numeric_only:是否仅仅计算数字型的columns,布尔值
- na_option:NaN值是否参与排序及如何排序(‘keep’,‘top',’bottom')
- ascending:设定升序排还是降序排,默认为升序True
- pct:是否以排名的百分比显示排名(当前排名与总数的百分比)
- method:排名方式选择('average','first','min', 'max','dense')
'average', 跳跃排序,并列取平均排名
'max',跳跃排序,并列取最小排名
'min',跳跃排序,并列取最大排名
'dense',密集排序,并列取排名相同,排名不跳跃
'first',顺序排序,相同时,谁在前排名靠前,排名不跳跃
# 对语文成绩降序排序,取其中三列
df = df.sort_values(by='语文')[['姓名','语文']]
df
# 5种不同排序方法的比较
df['first'] = df['语文'].rank(method='first')
df['average'] = df['语文'].rank()
df['max'] = df['语文'].rank(method='max')
df['min'] = df['语文'].rank(method='min')
df['dense'] = df['语文'].rank(method='dense')
df['pct'] = df['语文'].rank(pct=True)
df
分组排序:
df = df.sort_values(by=['班级','语文']).reset_index(drop=True)
df['分组排序'] = df.groupby('班级').apply(lambda x:x['语文'].rank(method='dense')).reset_index(drop=True)
df
三、其他常用数学计算
df.eval('result=first + average',inplace=True) # 表达式计算生成新列
# 四舍五入
df.round(2) # 全部数字字段
df.round({'result': 0, 'pct': 3}) # 指定列
df + 1
df.add() # 加
df.sub() # 减
df.mul() # 乘
df.div() # 除
df.mod() # 模,除后的余数
df.pow() # 指数幂
df.dot(df2) # 矩阵运算
# series特有的函数
s = df['result']
s.nlargest() # 最大的前5个
s.nlargest(15) # 最大的前15个
s.nsmallest() # 最小的前5个
s.nsmallest(15) # 最小的前15个
s.value_counts() # 去重分组统计
s.pct_change() # 与前一个数变化的百分比=(今-前)/前