Pandas---4.运算

一、数值运算

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

  1. 当某一方的标签不存在时,默认以NaN填充。缺失值会在运算过程中传播。(由于NaN是浮点数中的一个特殊值,因此结果的元素类型被转换为float64
  2. 结果的索引是双方索引的并集

2.除了支持加减乘除等运算符之外,pandas还提供了对应的函数: add/sub/mul/div/mod(other, axis='columns', level=None, fill_value=None):

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

全部运算操作函数为:

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

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

举例:

二、排序

1.sort_index()

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

1 DataFrame/Series.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True)

参数:

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

举例:

2.sort_values()

.sort_values()方法的作用是根据元素值进行排序。

1 DataFrame/Series.sort_values(by, axis=0, ascending=True, inplace=False, 
2   kind='quicksort', na_position='last')
3 Series.sort_values(axis=0, ascending=True, inplace=False, 
4   kind='quicksort', na_position='last')

参数:

  1. by:一个字符串或者字符串的列表,指定希望对那些label对应的列或者行的元素进行排序。对于DataFrame,必须指定该参数。而Series不能指定该参数。

    1. 如果是一个字符串列表,则排在前面的label的优先级较高。它指定了用于比较的字段

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

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

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

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

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

举例:

3.sortlevel()

 1 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的索引也排序。

举例:

4.rank()

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

1 DataFrame/Series.rank(axis=0, method='average', numeric_only=None,
2  na_option='keep', ascending=True, pct=False)

 参数:

  1. axis:指定沿着那个轴排名。如果为0/'index',则沿着行排名(对列排名);如果为1/'columns',则沿着列排名(对行排名)。

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

    1. 'average':为各个等值平均分配排名,这N个数的排名都是i=0N1(K+i)N=K+N12

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

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

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

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

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

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

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

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

举例:

三、统计

1.支持numpy的数组接口,直接使用ufunc函数

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

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

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

举例:

2.数值运算类方法

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

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

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

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

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

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

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

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

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

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

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

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

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

举例:

 

3.最大最小

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

举例:

 

4.统计类方法

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

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

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

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

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

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

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

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

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

    1. 对随机变量X,E(XK),K=1,2,...若存在,则称它为$X$的$k$阶原点矩,简称$k$阶矩。若$E\left[(X-E(X))^{k}\right], k=1,2, \cdots$存在,则称它为X的k阶中心矩。
  9. DataFrame.describe([percentiles, include, ...]):获取顺序统计量以及其他的统计结果。

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

    1. 'pearson':标准的相关系数
    2. 'kendall'Kendall Tau相关系数
    3. 'spearman'Spearman rank相关系数

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

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

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

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

举例:

5.唯一值、值计数、成员资格

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

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

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

    DataFrame也有此方法。

举例:

6.多级索引

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

posted @   nxf_rabbit75  阅读(328)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
历史上的今天:
2018-12-27 去掉python的警告
一、数值运算二、排序1.sort_index()2.sort_values()3.sortlevel()4.rank()三、统计1.支持numpy的数组接口,直接使用ufunc函数2.数值运算类方法3.最大最小4.统计类方法5.唯一值、值计数、成员资格6.多级索引
点击右上角即可分享
微信分享提示