返回介绍

数学基础

统计学习

深度学习

工具

Scala

四、 运算

发布于 2023-07-17 23:38:23 字数 17650 浏览 0 评论 0 收藏 0

1. 数值运算

  1. 当进行数值运算时,pandas会按照标签对齐元素:运算符会对标签相同的两个元素进行计算。对于DataFrame,对齐会同时发生在行和列上。

    • 当某一方的标签不存在时,默认以NaN填充。缺失值会在运算过程中传播。

    由于NaN是浮点数中的一个特殊值,因此结果的元素类型被转换为float64

    • 结果的索引是双方索引的并集。
  2. 除了支持加减乘除等运算符之外,pandas还提供了对应的函数: add/sub/mul/div/mod(other, axis='columns', level=None, fill_value=None):

    • other:一个DataFrame/Series或者一个array-like,或者一个标量值
    • axis:指定操作的轴。可以为0/1/'index'/'columns' 。其意义是:操作发生在哪个轴上。
    • fill_value:指定替换掉NaN的值。可以为None(不替换),或者一个浮点值。注意:如果发现两个NaN相加,则结果仍然还是NaN,而并不会是两个fill_value相加。
    • level:一个整数或者label,用于多级索引的运算。

    全部运算操作函数为:

    
    
    xxxxxxxxxx
    add,sub,mul,div,truediv,floordiv,mod,pow,radd,rsub,rmul,rdiv,rtruediv, rfloordiv,rmod,rpow # 这些的参数为 other,axis,level,fill_value lt,gt,le,ge,ne,eq# 这些的参数为 ohter,axis,level

    对于DataFrameSeries的运算,默认会用DataFrame的每一行与Series运算。如果你希望使用DataFrame的每一列与Series运算,则必须使用二元操作函数,并且指定axis=0(表示操作匹配的轴)。

    operate1 operate2 operate3

2. 排序

  1. .sort_index()方法的作用是根据label排序(而不是对存放的数据排序)。

    
    
    xxxxxxxxxx
    DataFrame/Series.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True)
    • axis:指定沿着那个轴排序。如果为0/'index',则对沿着0轴,对行label排序;如果为1/'columns',则沿着 1轴对列label排序。
    • level:一个整数、label、整数列表、label list或者None。对于多级索引,它指定在哪一级上排序。
    • ascending:一个布尔值,如果为True,则升序排序;如果是False,则降序排序。
    • inplace:一个布尔值,如果为True,则原地修改。如果为False,则返回排好序的新对象
    • kind:一个字符串,指定排序算法。可以为'quicksort'/'mergesort'/'heapsort'。注意只有归并排序是稳定排序的
    • na_position:一个字符串,值为'first'/'last',指示:将NaN排在最开始还是最末尾。
    • sort_remaining:一个布尔值。如果为True,则当多级索引排序中,指定level的索引排序完毕后,对剩下level的索引也排序。 sort_index1 sort_index2
  2. .sort_values()方法的作用是根据元素值进行排序。

    
    
    xxxxxxxxxx
    DataFrame/Series.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last') Series.sort_values(axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
    • by:一个字符串或者字符串的列表,指定希望对那些label对应的列或者行的元素进行排序。对于DataFrame,必须指定该参数。而Series不能指定该参数。

      • 如果是一个字符串列表,则排在前面的label的优先级较高。

        它指定了用于比较的字段

    • axis:指定沿着那个轴排序。如果为0/'index',则沿着0轴排序(此时by指定列label,根据该列的各元素大小,重排列各行);如果为1/'columns',则沿着 1轴排序(此时by指定行label,根据该行的各元素大小,重排列各列)。

    • ascending:一个布尔值,如果为True,则升序排序;如果是False,则降序排序。

    • inplace:一个布尔值,如果为True,则原地修改。如果为False,则返回排好序的新对象

    • kind:一个字符串,指定排序算法。可以为'quicksort'/'mergesort'/'heapsort'。注意只有归并排序是稳定排序的

    • na_position:一个字符串,值为'first'/'last',指示:将NaN排在最开始还是最末尾。

    sort_values1 sort_values2

  3. DataFrame/Series.sortlevel(level=0, axis=0, ascending=True, inplace=False, sort_remaining=True):根据单个level中的label对数据进行排列(稳定的)

    • axis:指定沿着那个轴排序。如果为0/'index',则沿着0轴排序 ;如果为1/'columns',则沿着 1轴排序
    • level:一个整数,指定多级索引的level
    • ascending:一个布尔值,如果为True,则升序排序;如果是False,则降序排序。
    • inplace:一个布尔值,如果为True,则原地修改。如果为False,则返回排好序的新对象
    • sort_remaining:一个布尔值。如果为True,则当多级索引排序中,指定level的索引排序完毕后,对剩下level的索引也排序。

    sort_level0 sort_level1

  4. .rank()方法的作用是在指定轴上计算各数值的排,其中相同数值的排名是相同的。

    
    
    xxxxxxxxxx
    DataFrame/Series.rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)
    • axis:指定沿着那个轴排名。如果为0/'index',则沿着行排名(对列排名);如果为1/'columns',则沿着列排名(对行排名)。

    • method:一个字符串,指定相同的一组数值的排名。假设数值 v一共有N个。现在轮到对v排序,设当前可用的排名为k

      • 'average':为各个等值平均分配排名,这N个数的排名都是

        $ \frac{\sum_{i=0}^{N-1}(K+i)}{N}=K+\frac{N-1}{2} $

      • 'min':使用可用的最小的排名,这N个数的排名都是 k

      • 'max':使用可用的最大的排名,这N各数的排名都是 k+N-1

      • 'first:根据元素数据中出现的顺序依次分配排名,即按照它们出现的顺序,其排名分别为 k,k+1,...k+N-1

      • 'dense:类似于 'min',但是排名并不会跳跃。即比v大的下一个数值排名为k+1,而不是k+N

    • numeric_only :一个布尔值。如果为True,则只对float/int/bool数据排名。仅对DataFrame有效

    • na_option:一个字符串,指定对NaN的处理。可以为:

      • 'keep':保留NaN在原位置
      • 'top':如果升序,则NaN安排最大的排名
      • 'bottom':如果升序,则NaN安排最小的排名
    • ascending:一个布尔值,如果为True,则升序排名;如果是False,则降序排名。

    • pct:一个布尔值。如果为True,则计算数据的百分位数,而不是排名。

    rank1 rank2 rank3

3. 统计

  1. SeriesDataFrame对象都支持Numpy的数组接口,因此可以直接使用Numpy提供的ufunc函数对它们进行运算。这些函数通常都有三个常用参数:

    • axis:指定运算沿着哪个轴进行
    • level:如果轴是多级索引MultiIndex,则根据level分组计算
    • skipna:运算是否自动跳过NaN

    下面的方法使用如下的两个SeriesDataFrame: stats0

  2. 数值运算类方法:(下面的DataFrame方法对于Series也适用)

    • DataFrame.abs():计算绝对值(只对数值元素进行计算)

    • DataFrame.all([axis, bool_only, skipna, level]):返回指定轴上:是否所有元素都为True或者非零。bool_onlyTrue则仅考虑布尔型的数据。

    • DataFrame.any([axis, bool_only, skipna, level]) :返回指定轴上:是否存在某个元素都为True或者非零。bool_onlyTrue则仅考虑布尔型的数据。

    • DataFrame.clip([lower, upper, axis]) :将指定轴上的数据裁剪到[lower,upper]这个闭区间之内。超过upper的值裁剪成upper;小于lower的值裁剪成lower

    • DataFrame.clip_lower(threshold[, axis]):返回一份拷贝,该拷贝是在指定轴上:向下裁剪到threshold

    • DataFrame.clip_upper(threshold[, axis]):返回一份拷贝,该拷贝是在指定轴上:向上裁剪到threshold

    • DataFrame.prod([axis, skipna, level, ...]) :计算指定轴上的乘积

    • DataFrame.sum([axis, skipna, level, ...]):沿着指定轴,计算样本的和

    • DataFrame.cumsum([axis, skipna]) :计算沿着axis轴的累积和。

    • DataFrame.cumprod([axis, skipna]) :计算沿着axis轴的累积乘积。

    • DataFrame.count([axis, level, numeric_only]):计算沿着axis轴,level级索引的非NaN值的数量。如果numeric_onlyTrue,则只考虑数值和布尔类型。

      对于Series,只有level一个参数。

    • DataFrame.round([decimals]) :对元素指定小数点位数。decimals可以为一个整数(所有的元素都按照该小数点位数)、一个字典(根据列label指定) stats_compute0 stats_compute1 stats_compute2

  3. 最大最小:(下面的DataFrame方法对于Series也适用)

    • DataFrame.max([axis, skipna, level, ...]): 沿着指定轴,计算最大值

    • DataFrame.min([axis, skipna, level, ...]): 沿着指定轴,计算最小值

    • Series.argmax([axis, skipna, ...]): 计算最大值的索引位置(一个整数值)

      pandas 0.20 以后,它返回的不再是索引位置,而是索引 label,等价于 idxmax

    • Series.argmin([axis, skipna, ...]): 计算最小值的索引位置(一个整数值)

      pandas 0.20 以后,它返回的不再是索引位置,而是索引 label,等价于 idxmin

    • Series.idxmax([axis, skipna, ...]): 计算最大值的索引label

    • Series.idxmin([axis, skipna, ...]): 计算最小值的索引label

    • DataFrame.cummax([axis, skipna]) :计算沿着axis轴的累积最大值。

    • DataFrame.cummin([axis, skipna]) :计算沿着axis轴的累积最最小值。

    • DataFrame.quantile([q, axis, numeric_only, ...]):计算指定轴上样本的百分位数。q为一个浮点数或者一个array-like。每个元素都是 0~1之间。如 0.5代表 50%分位

    • DataFrame.rank([axis, method, numeric_only, ...]):计算指定轴上的排名。

    • DataFrame.pct_change([periods, fill_method, ...]):计算百分比变化。periods为相隔多少个周期。它计算的是:(s[i+periods]-s[i])/s[i],注意结果并没有乘以 100。

    • Series.nlargest( *args,**kwargs):计算最大的N个数。参数为:

      • n:最大的多少个数
      • keep:遇到重复值时怎么处理。可以为:'first'/'last'
    • Series.nsmallest( *args,**kwargs):计算最小的N个数。参数同上。

    stats_minmax0 stats_minmax1

  4. 统计类方法:(下面的DataFrame方法对于Series也适用)

    • DataFrame.mean([axis, skipna, level, ...]):沿着指定轴,计算平均值

    • DataFrame.median([axis, skipna, level, ...]):沿着指定轴,计算位于中间大小的数

    • DataFrame.var([axis, skipna, level, ddof, ...]):沿着指定轴,计算样本的方差

    • DataFrame.std([axis, skipna, level, ddof, ...]):沿着指定轴,计算样本的标准差

    • DataFrame.mad([axis, skipna, level]):沿着指定轴,根据平均值计算平均绝对离差

    • DataFrame.diff([periods, axis]):沿着指定轴的一阶差分。periods为间隔。

    • DataFrame.skew([axis, skipna, level, ...]):沿着指定轴计算样本的偏度(二阶矩)

    • DataFrame.kurt([axis, skipna, level, ...]):沿着指定轴,计算样本的峰度(四阶矩)

      • 对随机变量 $ MathJax-Element-16 $ , $ MathJax-Element-11 $ 若存在,则称它为 $ MathJax-Element-16 $ 的 $ MathJax-Element-17 $ 阶原点矩,简称 $ MathJax-Element-17 $ 阶矩。若 $ MathJax-Element-15 $ 存在,则称它为 $ MathJax-Element-16 $ 的 $ MathJax-Element-17 $ 阶中心矩。
    • DataFrame.describe([percentiles, include, ...]):获取顺序统计量以及其他的统计结果。

      • percentiles:一个array-like。每个元素都是 0~1之间。如 0.5代表 50%分位
      • include,exclude:指定包含/不包含哪些列(通过dtype来指定)。可以为None/'all',或者一个dtype列表
    • DataFrame.corr([method, min_periods]):计算任意两个列之间的非NAN的、按照索引对齐的值的相关系数。method为相关系数的类型,可以为:

      • 'pearson':标准的相关系数
      • 'kendall'Kendall Tau相关系数
      • 'spearman'Spearman rank相关系数

      min_periods:一个整数。它指定为了生成一个有效的相关系数,每一对列数据的最短长度。

    • DataFrame.corrwith(other[, axis, drop]) :计算两个DataFrame的行-行、列-列的相关系数。

      • axis:如果为0/'index'则沿着0轴,则计算列-列之间的相关系数。如果为1/'columns',则沿着1轴,计算行-行之间的相关系数
      • drop:一个布尔值。如果为True,则如果某行/列都是NaN,则抛弃该行/列。如果为False,则返回全部。
    • DataFrame.cov([min_periods]):计算任意两列之间的协方差。min_periods指定为了生成一个有效的协方差,每一对列数据的最短长度。

      • 对于Series,其调用为:Series.cov(other,[min_periods])

    stats_stats0 stats_stats1 stats_stats2

  5. 对于Series:唯一值、值计数、成员资格:

    • Series.unique():返回Series中唯一值组成的一维ndarray

    • Series.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True):对Series中的数进行计数。如果normalizeTrue,则返回频率而不是频数。sortTrue则结果根据出现的值排序,排序方式由ascending指定。

      • bins是一个整数或者None。如果它为整数,则使用半开半闭区间来统计,它给出了该区间的数量。
    • Series.isin(values):返回一个布尔数组,给出Series中各值是否位于values中。

      DataFrame也有此方法。

    stats_unique

  6. 对于多级索引,可以通过level参数来指定在某个轴上的操作索引级别。如果level=None,则不考虑索引的多级。 stats_stats_multiIndex

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文