数据分析库pandas入门 2——数值运算、统计、排序
本文主要介绍pandas数据的数值运算、统计和排序,这三者是拿到一个数据集后经常要做的操作。
在上一篇中,笔者介绍了pandas的两种基本数据结构:Series和DataFrame,并介绍了这两种对象的创建方法、从文件导入创建DataFrame的方法、把DataFrame数据导出到文件方法以及查看 DataFrame 和 Series 对象基本信息的方法。本文主要介绍pandas数据的数值运算、统计和排序,这三者是拿到一个数据集后经常要做的操作。
数值运算
当进行数值运算时,pandas会按照标签对齐元素:运算符会对标签相同的两个元素进行计算。对于DataFrame,对齐会同时发生在行和列上。当某一方的标签不存在时,默认以NaN填充,缺失值会在运算过程中传播,结果的索引是双方索引的并集。除了支持加减乘除等运算符,pandas还提供了对应的函数,函数参数一般都是other、axis、 level、fill_value。其中,other是一个DataFrame/Series或者一个array-like,或者一个标量值;axis指定操作的轴,可以为0/1/‘index’/‘columns’ ,表示操作发生在哪个轴上;level是一个整数或者label,用于多级索引的运算;fill_value指定替换掉NaN的值,可以为None(不替换),或者一个浮点值。示例如下:
import numpy as np
import pandas as pd
df = pd.DataFrame({'c1':[1,3,5,7],'c2':[2,4,6,8]}, index=['a','b','c','d'])
df2 = pd.DataFrame({'c1':[2,9,6,0],'c3':[12,14,16,18]}, index=['a','b','c','e'])
df + 10 # df中每个元素都加10,“+”可以换成“-、*、/、//、%”
df + [2,3] # df列的数值加上列表中相应值,即加法在列上进行广播
df + df2 # df和df2中每个元素对应相加,缺失值用NaN填充
df.add(df2) # 同上
df.sub(df2) # 减法,与 df - df2 或者 df.subtract(df2)相同
df.mul(df2) # 乘法,与 df * df2 或者 df.multiply(df2)相同
df.div(df2) # 除法,与 df / df2 或者 df.divide(df2) 或者 df.truediv(df2)相同
df.floordiv(df2) # 整除,与 df // df2相同,取df/df2的整数部分
df.mod(df2) # 取模,与 df % df2相同
df.pow(df2) # 幂运算,即df的df2次幂
df.radd(df2) # df2 + df
df.rsub(df2) # df2 - df
df.rmul(df2) # df2 * df
df.rdiv(df2) # df2 / df,与df.rtruediv(df2)相同
df.rfloordiv(df2) # df2 // df
df.rmod(df2) # df2 % df
df.rpow(df2) # df2的df次幂
df.lt(df2) # df的值是否小于对应df2的值,返回DataFrame,缺失值用NaN填充,若两者都没指定行列标签,则与 df < df2 相同
df.gt(df2) # 同上,df > df2
df.le(df2) # 同上,df <= df2
df.ge(df2) # 同上,df >= df2
df.eq(df2) # 同上,df == df2
df.ne(df2) # 同上,df != df2
df.equals(df2) # df是否与df2完全相等,返回True或False
df.isin(values) # 返回df中的值是否出现在values中,返回同shape的DataFrame
df.abs() # 计算绝对值(只对数值元素进行计算)
df.all(axis, bool_only) # 返回指定轴上是否所有元素都为True或者非零。bool_only为True则仅考虑布尔型的数据
df.any(axis, bool_only) # 返回指定轴上是否有元素为True或者非零。bool_only同上。
df.clip(lower, upper) # 将元素值裁剪到[lower,upper]闭区间之内,超过upper的值裁剪成upper;小于lower的值裁剪成lower。
df.round(decimals=0) # 对元素指定小数点位数。decimals可以是一个整数、一个字典(根据列label指定)
统计
Series和DataFrame对象都支持Numpy的数组接口,因此可以直接使用Numpy提供的 ufunc函数 对它们进行运算。这些函数通常有三个常用参数:
- axis:指定运算沿着哪个轴进行,默认为0,即对列统计
- skipna:运算是否自动跳过NaN,默认跳过
- level:如果轴是多级索引MultiIndex,则根据level分组计算
df.max() # 计算指定轴的最大值
df.min() # 计算指定轴的最小值
df.cummax() # 计算沿着指定轴的累积最大值
df.cummin() # 计算沿着指定轴的累积最小值
df.nlargest(n, col, keep) # 计算指定col列最大的n个数,返回该n个值所在行的行数据,keep指定对重复值取哪个,可取'first'或'last'
df.nsmallest(n, col, keep) # 计算指定col列最小的n个数,返回同上
df.sum() # 计算指定轴上的和
df.prod() # 计算指定轴上的乘积,与df.product()相同
df.cumsum(axis, skipna) # 计算沿着axis轴的累积和
df.cumprod(axis, skipna) # 计算沿着axis轴的累积乘积
df.count(axis, level, numeric_only) # 计算非NaN值的数量,若numeric_only为True,则只考虑数值和布尔类型。
df.nunique(axis, dropna=True) # 计算去重后的数据数量
df.sum() # 求和
df.mean() # 求均值
df.median() # 求中位数
df.var() # 求方差
df.std() # 求标准差
df.describe() # 对数值型列进行统计,计算count/mean/std/min/max和各四分位值
df.mad() # 求平均绝对离差(根据均值)
df.diff(periods)# 求一阶差分,periods是间隔,默认为1
df.skew() # 求偏度(二阶矩)
df.kurt() # 求峰度(四阶矩),同df.kurtosis()
df.cov() # 求任意两列之间的协方差,返回一个DataFrame
df.corr(method) # 求相关系数,默认计算method='pearson'相关系数,也可以取'spearmanr'系数,返回一个DataFrame
df.corrwith(other,axis,drop,method) # 计算两个DataFrame的行-行、列-列的相关系数,返回一个Series
df.quantile(q=0.5, axis)
# 计算指定轴上数据的百分位数,q为一个浮点数或者一个array-like,默认0.5代表50%分位
df.pct_change(periods=1)
# 计算百分比变化,periods为相隔多少个周期,计算的是:(s[i+periods]-s[i])/s[i],结果没有乘以100%
排序
df.sort_index(axis=0, level=None, ascending=True, inplace=False,
kind='quicksort', na_position='last', sort_remaining=True, ignore_index=False)
# 根据label排序(而不是对存放的数据排序)
df.sort_values(by, axis=0, ascending=True, inplace=False,
kind='quicksort', na_position='last', ignore_index=False)
# 根据元素值进行排序。参数by指定排序的列或者行,axis指定沿着列还是行排序,
# ascending默认为True表示升序,inplace表示是否原地修改,默认否,
# kind指定排序算法,na_position指定NaN值的位置默认最末尾,ignore_index表示十分忽略原索引
df.rank(axis=0, method='average', numeric_only=None,
na_option='keep', ascending=True, pct=False)
# 在指定轴上计算各数据的排名,数值相同排名也相同。pct如果为True,则计算数据的百分位数,而不是排名。
除了上述方法外,对于Series对象,还可以计算最值索引、唯一值、值计数和排序下标等等,示例如下:
series = df['c1']
series.argmax(axis, skipna=True) # 计算最大值的索引位置(一个整数)
series.argmin(axis, skipna=True) # 计算最小值的索引位置(一个整数)
series.idxmax(axis, skipna=True) # 计算最大值的索引label
series.idxmax(axis, skipna=True) # 计算最小值的索引label
series.unique() # 返回Series中唯一值组成的一维ndarray,无参数
series.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)
# 对Series中的数据进行计数。参数normalize为True则返回频率而不是频数。
# sort为True则结果根据出现的值排序,排序方式由ascending指定,默认降序。
# bins是一个整数或者None。如果为整数,则使用半开半闭区间统计,给出该区间的数量。
series.argsort(axis=0, kind='quicksort', order=None)
# 返回对数据升序排序后各值的下标
以上。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)