【Python】pandas:计算,统计,比较

news2024/9/20 5:30:29

pandas是Python的扩展库(第三方库),为Python编程语言提供 高性能、易于使用的数据结构和数据分析工具。

pandas官方文档:User Guide — pandas 2.2.2 documentation

帮助:可使用help(...)查看函数说明文档(若是第三方库的函数,需先导入库)。例如:help(pd.DataFrame),help(pd.crosstab)


Python代码中,导入pandas:

import pandas as pd

使用pandas时,通常涉及numpy,若需要也导入numpy:

import numpy as np


1、算术运算

数值行/列可以进行算术运算(加、减、乘、除、取余、幂等)。

2、与其他行/列进行计算

数值行/列可以与其他数值行/列进行计算。

3、用于计算的函数

(3-1)算术运算的函数:add, radd, sub, pow等

有一些函数可以用于算术运算,也可以将两个DataFrame之间进行计算。

例如(加法):DataFrame.add(self, other, axis='columns', level=None, fill_value=None)

注:参数other:数值、序列(如:列表/字典)、Series、另一个DataFrame。

        参数axis:指定轴。若other是Series默认按索引,若other是列表/字典默认按列。

        参数fill_value:指定NaN的填充内容。

常用算术运算的函数
DataFrame.add(...)
DataFrame.sub(...)
DataFrame.mul(...)
DataFrame.div(...)
DataFrame.truediv(...)
DataFrame.floordiv(...)除(返回整数)
DataFrame.mod(...)取余
DataFrame.pow(...)
DataFrame.rsub(...)减(反向)。不是“3-5”而是“5-3”
DataFrame.rdiv(...)除(反向)。不是“3/5”而是“5/3”
DataFrame.rmod(...)取余(反向)。不是“3%5”而是“5%3”
DataFrame.rpow(...)

幂(反向)。不是“3**5”而是“5**3”

DataFrame.abs(...)取绝对值

 

(3-2)累计计算的函数:cumsum, cummax等

有一些函数可以用于指定轴的累计计算(各位置的数值是按指定轴从位置0到该位置累计计算的数值)。

例如(累计求和):DataFrame.cumsum(self, axis=None, skipna=True, *args, **kwargs)

注:参数axis:指定轴。若axis=0 则各列累计计算,若axis=1 则各行累计计算。

       参数skipna:默认skipna=True 跳过NaN。

常用累计计算的函数
DataFrame.cummax(...)指定轴,各位置数值是从位置0到该位置的累计最大值
DataFrame.cummin(...)指定轴,各位置数值是从位置0到该位置的累计最小值
DataFrame.cumsum(...)指定轴,各位置数值是从位置0到该位置的累计求和
DataFrame.cumprod(...)指定轴,各位置数值是从位置0到该位置的累计乘积

 (3-3)计算矩阵乘法的函数:dot

dot(self, other: 'AnyArrayLike | DataFrame') -> 'DataFrame | Series'

  • DataFrame.dot(other):DataFrame与另一个DataFrame或Series进行矩阵乘法。
  • 等效于:DataFrame @ other
  • 注:DataFrame和other维度需兼容(即DataFrame的列数和other的行数相同),才能进行矩阵乘法。结果是新DataFrame(原DataFrame的行数,other的列数)。

 DataFrame.columns和other.index需相同,否则报错:ValueError: matrices are not aligned。

4、用于统计的函数

(4-1)统计数据的函数:sum, max, mean等

有一些函数可以用于统计数据(求和,最大值,最小值,平均值等)。

例如(求和):DataFrame.sum(self, axis=None, skipna=True, level=None, numeric_only=None, min_count=0, **kwargs)

注:参数axis:指定轴。若axis=0 则各列求和,若axis=1 则各行求和。

       参数skipna:默认skipna=True 跳过NaN。

       参数numeric_only:只能浮点数、整型、布尔类型。

       参数min_count:指定非NaN值最小个数,若小于该数值,结果为NaN。

常用统计的函数
DataFrame.sum(...)指定轴,求和
DataFrame.prod(...)指定轴,求乘积
DataFrame.max(...)指定轴,求最大值
DataFrame.idxmax(...)指定轴,求最大值的索引位置
DataFrame.min(...)指定轴,求最小值
DataFrame.idxmin(...)指定轴,求最小值的索引位置
DataFrame.mean(...)指定轴,求平均值
DataFrame.median(...)指定轴,求中位值(排序后位于中间的值,若两个取这两个的平均值)
DataFrame.skew(...)指定轴,求倾斜度(偏度)
DataFrame.count(...)

指定轴,统计非NaN值的数量

DataFrame.describe()DataFrame的统计信息
DataFrame.info()

DataFrame的信息

添加一行总计和一列总计。 

统计指定轴 NaN值的数量:DataFrame.isna().sum(axis=指定轴)

统计指定轴 非NaN值的数量:DataFrame.count(axis=指定轴) 或者 DataFrame.notna().sum(axis=指定轴)

统计所有 NaN值的数量:DataFrame.isna().values.sum()

统计所有 非NaN值的数量:DataFrame.notna().values.sum()

共有多少数据:DataFrame.size

(4-2)交叉表(简单统计数量):crosstab

crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins: 'bool' = False, margins_name: 'str' = 'All', dropna: 'bool' = True, normalize=False) -> 'DataFrame'

注:默认dropna=True 整行都是NaN则删除。

  • pd.crosstab(行索引数据, 行索引数据):行索引和列索引都可以是数组或Series或列表形式的数组/Series。获取行索引数据和行索引数据的交叉表(简单统计数量) 。
  • pd.crosstab(行索引数据, 行索引数据, margins=True, margins_name=总计名):获取行索引数据和行索引数据的交叉表(简单统计数量) ,显示总计行/列,默认名为All,可自定义总计名。
  • pd.crosstab(行索引数据, 行索引数据, dropna=False):获取行索引数据和行索引数据的交叉表(简单统计数量) 。整行都是NaN的也保留。

5、用于比较的函数

(5-1)比较数据的函数:lt, eq, ge等

DataFrame各元素可与数值和其他Series/DataFrame比较。

例如(小于):DataFrame.lt(self, other, axis='columns', level=None)

注:参数other:数值、序列(如:列表)、Series、另一个DataFrame。

  •  DataFrame.lt(other):DataFrame各元素与other比较,若符合比较条件,则相应位置为True,否则False。
DataFrame.lt(other)<less thanDataFrame各元素与other比较,若小于 则对应位置为True,否则为False
DataFrame.le(other)\leqless than or equalDataFrame各元素与other比较,若小于等于 则对应位置为True,否则为False
DataFrame.eq(other)=equalDataFrame各元素与other比较,若等于 则对应位置为True,否则为False
DataFrame.ne(other)\neqnot equalDataFrame各元素与other比较,若不等于 则对应位置为True,否则为False
DataFrame.gt(other)>greater thanDataFrame各元素与other比较,若大于 则对应位置为True,否则为False
DataFrame.ge(other)\geqgreater than or equalDataFrame各元素与other比较,若大于等于 则对应位置为True,否则为False

(5-2)两个DataFrame比较,返回不同的数据:compare

compare(self, other: 'DataFrame', align_axis: 'Axis' = 1, keep_shape: 'bool' = False, keep_equal: 'bool' = False) -> 'DataFrame'

  • DataFrame.compare(other):两个DataFrame比较,返回不同的数据。相同的默认显示NaN。默认self和other分别作为列索引显示。
  • DataFrame.compare(other, align_axis=0):两个DataFrame比较,返回不同的数据。相同的默认显示NaN。指定self和other分别作为行索引显示。
  • DataFrame.compare(other, keep_shape=True, keep_equal=True):两个DataFrame比较,返回不同的数据。相同的也显示。保留原形状。

(5-3) 比较两个DataFrame中的数据是否都相同:equals

equals(self, other: 'object') -> 'bool_t'

  • DataFrame.equals(另一个DataFrame):比较两个DataFrame中的数据是否都相同(对应数据类型也相同),都相同结果为True,否则False。若对应的数据类型不同,结果也为False。


6、应用一个函数:apply, applymap, map

(6-1)DataFrame/Series指定轴,应用一个函数:apply

apply(self, func: 'AggFuncType', axis: 'Axis' = 0, raw: 'bool' = False, result_type=None, args=(), **kwargs)

注:参数func:应用一个函数,函数后面不需要括号( )。参数args:元组形式,func的参数。

       参数axis:指定轴,默认axis=0 按行轴(各列)。

       参数result_type:结果显示。若元素是列表且axis=1可以扩展成多列。

  • DataFrame.apply(函数):各列元素依次应用函数,返回函数操作后结果。
  • DataFrame.apply(函数, args=函数参数):各列元素依次应用函数(函数参数以元组形式表示),返回函数操作后结果。

单列使用apply,可以依次判断元素。

DataFrame使用apply,默认指定轴,若指定轴中各行/列无法正确评估Series的值,则报错:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

可使用any或all或其他便于正确评估Series值。

添加一行总计和一列总计。 


(6-2)DataFrame每个元素,应用一个函数:applymap

applymap(self, func: 'PythonFuncType', na_action: 'str | None' = None, **kwargs) -> 'DataFrame'

  • DataFrame.applymap(函数):每个元素应用函数,每个元素返回各自对应的结果。
  • DataFrame.applymap(函数, 函数参数=值):每个元素应用函数(函数参数设定值),每个元素返回各自对应的结果。

 (6-3)Series每个元素,应用一个函数或映射:map

Series.map(self, arg, na_action=None) -> 'Series'

  • Series.map(函数或mapping或字典):Series每个元素应用函数或mapping,返回Series。

补充:apply, applymap, map

apply必要参数:函数用于DataFrame的各行或各列。也用于Series每个元素。
applymap必要参数:函数用于DataFrame每个元素。
map必要参数:函数或映射用于Series每个元素。


7、应用多个函数:transform, agg

(7-1)指定轴,应用多个函数转换数据:transform

transform(self, func: 'AggFuncType', axis: 'Axis' = 0, *args, **kwargs) -> 'DataFrame'

注:默认axis=0 按行(各列)转换。

  • DataFrame.transform(函数或字符串):各列按指定函数转换数据。
  • DataFrame.transform(列表):各列按列表中指定的多个函数转换数据。
  • DataFrame.transform(字典):各列按字典中对应的函数转换数据。字典中键为列名。字典中值为对应转换的函数,若值是列表,则指定列按多个函数转换数据。

transform可以和groupby一起使用。

DataFrameGroupBy.transform(func*argsengine=Noneengine_kwargs=None**kwargs)

  • DataFrame.groupby(分组列名)[转换列名].transform(函数):按分组列名分组后,指定转换列按组应用函数。

(7-2)指定轴,按多个函数聚合:agg

agg = aggregate(self, func=None, axis: 'Axis' = 0, *args, **kwargs)

aggregate(self, func=None, axis: 'Axis' = 0, *args, **kwargs)

agg是aggregate的别名。

  • DataFrame.agg(函数或字符串):各列按指定函数聚合。
  • DataFrame.agg(列表):各列按列表中指定的多个函数聚合。
  • DataFrame.agg(字典):各列按字典中对应的函数聚合。字典中键为列名。字典中值为函数,若值是列表,则指定列按多个函数聚合。

agg通常和groupby一起使用。

DataFrameGroupBy.agg(func=None*argsengine=Noneengine_kwargs=None**kwargs)

  • DataFrame.agg(分组列名).transform(函数):按分组列名分组后,按组按指定函数聚合。 


8、窗口函数:rolling, expanding, ewm

(8-1)移动窗口计算:rolling

rolling(self, window: 'int | timedelta | BaseOffset | BaseIndexer', min_periods: 'int | None' = None, center: 'bool_t' = False, win_type: 'str | None' = None, on: 'str | None' = None, axis: 'Axis' = 0, closed: 'str | None' = None, method: 'str' = 'single')

return : Window 或 Rolling

  • DataFrame.rolling(窗口大小):指定窗口大小依次向下移动计算,前几个不满足窗口大小的结果为NaN。
  • DataFrame.rolling(窗口大小, min_periods=最少数据):指定窗口大小依次向下移动计算,前几个虽不满足窗口大小但满足最少数据个数的的开始计算,既不满足窗口大小也不满足最少数据个数的结果为NaN。
  • DataFrame.rolling(窗口大小, min_periods=最少数据, center=True):指定窗口大小依次向下移动计算,前几个虽不满足窗口大小但满足最少数据个数的的也可以计算,既不满足窗口大小也不满足最少数据个数的结果为NaN。窗口居中。

rolling返回的结果,计算函数有限,例如:sum, max, count等。

 (具体参考:Window — pandas 2.2.2 documentation (pydata.org))

(8-2)扩展窗口计算:expanding

expanding(self, min_periods: 'int' = 1, center: 'bool_t | None' = None, axis: 'Axis' = 0, method: 'str' = 'single') -> 'Expanding'

  • DataFrame.expanding(最少数据):满足最少数据个数,就可以开始依次向下累积求和,前几个不满足最少数据个数的结果为NaN。
  • 注:参数center未来将被移除。

expanding返回的结果,计算函数有限,例如:sum, max, count等。

 (具体参考:Window — pandas 2.2.2 documentation (pydata.org))

(8-3)指数加权移动平均:ewm

加权移动平均:按不同权重求出移动平均值,并以最后的移动平均值确定预测值。

指数加权移动平均(EWMA):权重随时间呈指数级递减,越靠近当前时刻 数据的权重越大。指数加权移动平均法是常用的统计技术。

ewm(self, com: 'float | None' = None, span: 'float | None' = None, halflife: 'float | TimedeltaConvertibleTypes | None' = None, alpha: 'float | None' = None, min_periods: 'int | None' = 0, adjust: 'bool_t' = True, ignore_na: 'bool_t' = False, axis: 'Axis' = 0, times: 'str | np.ndarray | DataFrame | Series | None' = None, method: 'str' = 'single') -> 'ExponentialMovingWindow'

  • DataFrame.ewm(com=指定衰减因子):指数加权移动平均。α=1/(1+com)【注:com\geq0】。
  • DataFrame.ewm(span=指定时间跨度衰减因子):指数加权移动平均。α=2/(span+1)【注:span\geq1】。
  • DataFrame.ewm(alpha=直接指定平滑指数的衰减因子):指数加权移动平均。α【注:0<α\leq1】。
  • DataFrame.ewm(halflife=指定半衰期的衰减因子):指数加权移动平均。α=1-exp(-ln(2)/halflife)   【注:halflife>0】。
  • 注:参数adjust是否修正因子,默认adjust=True。

ewm返回的结果,计算函数有限,例如:mean, sum, std等。

 (具体参考:Window — pandas 2.2.2 documentation (pydata.org))


补充:

1、两个DataFrame应用函数合并列:combine

combine(self, other: 'DataFrame', func, fill_value=None, overwrite: 'bool' = True) -> 'DataFrame'

注:按元素合并列。

  • DataFrame.combine(另一个DataFrame,函数):两个DataFrame元素传入合并函数后,结果中行列索引为两个DataFrame的并集。
  • DataFrame.combine(另一个DataFrame,函数, filll_value=指定值):两个DataFrame元素传入合并函数后,结果中的行列索引为两个DataFrame的并集。使用指定值填充NaN。

2、判断元素是否存在:isin

isin(self, values) -> 'DataFrame'

注:参数values:可迭代对象(列表/元组等)、Series、DataFrame、字典(值不能是单个内容)。

  • DataFrame.isin(values):DataFrame中每个元素,依次判断是否是指定元素,若是则该位置为True,否则False,返回形状相同的DataFrame(数据为布尔值True/False)。
  • 注:values不能是单个内容。若values是字典,字典的值也不能是单个内容。否则报错:TypeError: only list-like or dict-like objects are allowed to be passed to DataFrame.isin(), you passed a 'int'。


pandas 各函数官方文档:General functions — pandas 2.2.2 documentation (pydata.org)

DataFrame 各方法官方文档:DataFrame — pandas 2.2.2 documentation (pydata.org)

Series 各方法官方文档:Series — pandas 2.2.2 documentation (pydata.org)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1987294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文本编辑器小型架构

C字体库开发之字体列表设计七-CSDN博客 创作不易&#xff0c;小小的支持一下吧&#xff01;

odoo from样式更新

.xodoo_form {.o_form_sheet {padding-bottom: 0 !important;border-style: solid !important;border-color: white;}.o_inner_group {/* 线框的样式 *//*--line-box-border: 1px solid #666;*//*box-shadow: 0 1px 0 #e6e6e6;*/margin: 0;}.grid {display: grid;gap: 0;}.row …

【数据结构】排序 —— 归并排序(mergeSort)、计数排序、基数排序

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…

【数据结构】哈希应用-STL-位图

目录 1、位图的概念 2、位图的设计与实现 2.1 set 2.2 reset 2.3 test 3、C库中的位图 4、位图的优缺点 5、位图相关题目 1、位图的概念 面试题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这4…

【Material-UI】按钮组件中的实验性API:Loading按钮详解

文章目录 一、LoadingButton 组件概述1. 组件介绍2. 基本用法 二、LoadingButton 组件的高级用法1. 自定义加载指示器2. 图标与加载位置 三、已知问题与解决方法1. Chrome 翻译工具与 LoadingButton 的兼容性问题 四、实用性与未来展望1. 应用场景2. 未来展望 五、总结 Materia…

共享内存的原理及初识线程

char *str"hello world"; *str-H; 运行时报错&#xff0c;RWX只有R权限。 外设和内存交互以4KB为单位。 虚拟地址32位的划分为10 10 12 前10位对应页表的页目录。 在10位即为页表&#xff0c;页表中存放指定页框的起始物理地址虚拟地址的低12位作为页内偏移。 共…

RedLock算法分析

Redis分布式锁-RedLock算法 手写分布式锁的缺点 Redlock算法设计理念 Redis也提供了Redlock算法&#xff0c;用来实现基于多个实例的分布式锁。 锁变量由多个实例维护&#xff0c;即使有实例发生了故障&#xff0c;锁变量仍然是存在的&#xff0c;客户端还是可以完成锁操作。…

第一篇Linux介绍

目录 1、操作系统 2、Windows和Linux操作系统的区别 3、 Linux 的发行版本 4、 linux 分支 5、 Linux 的含义 6、Linux 特点 1、操作系统 常见操作系统有&#xff1a;Windows、MacOS、Unix/Linux。 类 UNIX Windows&#xff1a;其是微软公司研发的收费操作系统&#xff…

【漏洞复现】JBoss 中间件漏洞

JBoss介绍 JBoss是⼀个基于J2EE的开发源代码的应⽤服务器。JBoss代码遵循LGPL许可&#xff0c;可以在任何商业应⽤中免费使⽤。JBoss是⼀个管理EJB的容器和服务器&#xff0c;⽀持EJB1.1、EJB 2.0和EJB3的规范。但JBoss核⼼服务不包括⽀持servlet/JSP的WEB容器&#xff0c;⼀般…

QTableView使用示例-Qt模型视图委托(MVD)(Model-View-Delegate)

模型视图委托&#xff08;MVD&#xff09;是Qt中特有的设计模式&#xff0c;类似MVC设计模式&#xff0c;将MVC设计模式中的Controller当做MVD中的Delegate&#xff0c;两者的概念基本相同。不同的是委托不是独立存在&#xff0c;而是包含在视图里面。 模型视图委托设计模式中&…

步进电机驱动调试问题

工作中&#xff0c;调试24-byj48步进电机遇到一个怪现象&#xff1a; 1. 偶现 2. 出现问题时其中一个马达反转无法驱动&#xff0c;正转正常。 排查思路&#xff1a; 1. 将两个电机交叉验证&#xff0c;发现始终跟M2接口有关。排除电机问题。 2. 检查电机IO口配置&#xf…

大数据项目——广告数仓之HTTP概述

目录 第一章、理解URL 1.1 客户端、服务器 1.1.1 服务器与服务 1.1.2 客户端 1.2 URL 1.3 查询参数 第一章、理解URL 1.1 客户端、服务器 1.1.1 服务器与服务 所谓服务器&#xff0c;其实就是一台24小时不关机的计算机&#xff0c;它也有自己的cpu、内存、网卡、…

Docker更新镜像源小记

Docker镜像源无法访问 进入docker目录 cd /etc/docker/编辑daemon.json文件&#xff0c;如果没有&#xff0c;则新建 {"registry-mirrors": ["https://dockerproxy.cn"] }收集一些镜像源地址&#xff0c;未测是否能用 “https://hub.uuuadc.top”,“htt…

Android 埋点信息分析——内存篇

源码基于&#xff1a;Android U 0. 前言 在前一篇《Android statsd 埋点简析》一文中简单剖析了Android 埋点采集、传输的框架&#xff0c;本文在其基础对埋点信息进行解析&#xff0c;来看下Android 中埋下的内存信息有哪些。 1. 通过代码剖析google 埋点内容 1.1 PROCESS_M…

网络安全之sql靶场(11-23)

sql靶场&#xff08;11-23&#xff09; 目录 第十一关&#xff08;post注入&#xff09; 第十二关 第十三关 第十四关 第十五关 第十六关 第十七关 第十八关 第十九关 第二十关 第二十一关 第二十二关 第二十三关 第十一关&#xff08;post注入&#xff09; 查看…

echart 制作 Grafana 面板之仪表盘

目录 前言准备工作实现代码代码详解总结相关阅读 前言 Grafana 是一个开源的可视化监控工具&#xff0c;支持多种数据源&#xff0c;并且可以创建丰富的仪表盘。ECharts 是一个强大的开源数据可视化库&#xff0c;通过结合这两者&#xff0c;我们可以创建自定义的仪表盘&…

GPIO输出控制之LED闪烁、LED流水灯以及蜂鸣器应用案例

系列文章目录 STM32之GPIO&#xff08;General Purpose Input/Output&#xff0c;通用型输入输出&#xff09; 文章目录 系列文章目录前言一、LED和蜂鸣器简介1.1 LED1.2 蜂鸣器1.3 面包板 二、LED硬件电路2.1 低电平驱动电路2.2 高电平驱动电路 三、蜂鸣器硬件电路3.1 PNP型三…

使用idea 把一个git分支的部分提交记录合并到另一个git分支上

一、需求 需要将A&#xff08;合并分支&#xff09;分支上的提交记录中的某一次&#xff08;或几次&#xff09;提交合并到B&#xff08;被合并分支&#xff09;分支上 说明&#xff1a;熟练使用idea可以直接看下图即可&#xff0c;若不熟悉可以根据下列步骤进行操作&#xf…

富士乐施5070-V打印机驱动安装

富士乐施5070-V打印机驱动安装 特指打印A3纸张需求&#xff0c;即驱动中能够选择纸张类型&#xff08;安装选择305df驱动只能打印A4类型&#xff09; 富士乐施打印机驱动下载网址&#xff1a; https://m3support-fb.fujifilm-fb.com.cn/driver_downloads/www/ 安装流程&…

C#自定义快捷操作键的实现 - 开源研究系列文章

这次想到应用程序的快捷方式使用的问题。 Windows已经提供了API函数能够对窗体的热键进行注册&#xff0c;然后就能够在窗体中使用这些注册的热键进行操作了。于是笔者就对这个操作进行了整理&#xff0c;将注册热键操作写成了帮助类&#xff0c;并且用此博文来记录这个使用DEM…