Pandas库使用入门2

在上一篇中,笔者介绍了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)
# 返回对数据升序排序后各值的下标

以上。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐