-
2019-05-14 15:07:35更多相关内容
-
pandas数据分析之数据运算(逻辑运算、算术运算、统计运算、自定义运算)
2022-02-03 12:31:57数据分析离不开数据运算,在介绍完pandas的数据加载、排序和排名、数据清洗之后,本文通过实例来介绍pandas的常用数据运算,包括逻辑运算、算术运算、统计运算及自定义运算。数据分析离不开数据运算,在介绍完pandas的数据加载、排序和排名、数据清洗之后,本文通过实例来介绍pandas的常用数据运算,包括逻辑运算、算术运算、统计运算及自定义运算。
一、逻辑运算
逻辑运算是程序代码中经常用到的一种运算。pandas的逻辑运算与Python基础语法中的逻辑运算存在一些差异。pandas的逻辑运算主要用于条件过滤根据条件逻辑运算得出的结果过滤检索出相应的数据。
我们来看一些例子:
数据集为学生数据集import pandas as pd import numpy as np df = pd.read_excel('D:\\Python\\study\\pythontest\\pandastest\\数据集\\student.xlsx') df
我们要过滤检索出语文成绩大于95分的数据,通过df['4-语文']>95
的条件语句,可以得到一个结果为bool值的Series,True表示满足语文成绩>95分的,False表示不满足语文成绩>95的。
在pandas中,将Series与数值进行比较,会得到一个与自身形状相同且全为布尔值的Series,每个位置的布尔值对应该位置的比较结果。
这种进行比较的代码,返回值是布尔值,是一种布尔表达式,也可以被称为逻辑语句,只要代码返回的结果是布尔值,都可以把代码当成逻辑语句。
根据逻辑语句的布尔值,可以用来对数据进行筛选,按我们的需要从大量数据中过滤出目标数据。如我们要过滤出语文成绩大于95的数据,就可以用上述逻辑语句的布尔值进行筛选。df[df['4-语文']>95]
除了直接的比较,pandas中有很多函数都会返回布尔值,如all(),any(),isna()等对整个DataFrame或Series的判断结果,eq(),ne(),lt(),gt()等比较函数的结果,都是布尔值。
逻辑语句是为逻辑运算服务的,可以直接作为判断条件。在复杂的逻辑关系中,需要使用复合逻辑运算,用逻辑运算符来连接多个逻辑语句,复合逻辑运算包含:逻辑与&、逻辑或|、逻辑非~。逻辑与&
pandas中用符号 & 表示逻辑与,连接两个逻辑语句,同时为真才为真。在Python基本语法中,使用 and 表示逻辑与,但是Pandas中只能用 & ,不能用and,会报模糊错误。
如我们要检索出一班并且语文成绩大于95的数据。可以用df[(df['4-语文']>95) & (df['班级']=='一班')]
注意两个条件逻辑语句要分别用()括起来然后再用逻辑运算符进行运算。
逻辑或|
pandas中用符号 | 表示逻辑或,连接两个逻辑语句,只要其中一个为真就为真。
在Python基本语法中,使用 or 表示逻辑或,但是Pandas中只能用 | ,不能用or。
如我们要检索出语文成绩大于95或英语成绩大于96的数据df[(df['4-语文']>95)|(df['6-英语']>96)]
逻辑非~
pandas中用符号 ~ 表示逻辑非,对逻辑语句取反。
在Python基本语法中,使用 not 表示逻辑非,但是Pandas中只能用 ~ ,不能用not。
如我们要检索出数据成绩>98并且不是一班的同学df[(df['5-数学']>98) & ~(df['班级']=='一班')]
当然也可以用
df[(df['5-数学']>98) & (df['班级']!='一班')]
二、算术运算
pandas最重要的一个功能是,它可以对不同索引的对象进行算术运算也就是(+、-、*、\)。
常见的算术云算是加法+运算,如果相加的对象是标量,则数据对象通过广播机制,每个数据值都+标量。如果相加的对象是数据对象则按索引进行算术运算。
通过一个数据集来看一下import pandas as pd import numpy as np data1=pd.DataFrame(np.arange(16).reshape((4,4)),columns=['列1','列2','列3','列4']) data1
1、使用算术运算符
和标量计算,标量运算会在算术运算过程中传播。
data2=data1+1 data2
可以看到数据集中每个值都+1了
和索引相同的数据对象运算,对每个数据值进行算术运算data3=pd.DataFrame(np.arange(16).reshape((4,4)),columns=['列1','列2','列3','列4']) data4=data2+data3 data4
在将对象相加时,如果存在不同的索引就是该索引对的并集。自动的数据对齐操作在不重叠的索引引入NA值。缺失值会在算术运算过程中传播。
data5=pd.DataFrame(np.ones([3,3]),columns=['列1','列2','列3']) data5
data6=data4+data5 data6
2、使用算数运算函数
算数运算函数包括add、sub、div、mul等对应于算术运算符如下:
方法 说明 add,radd 用于加法(+)的方法 sub,rsub 用于减法(- )的方法 div,rdiv 用于除法(/)的方法 floordiv,rfloordiv 用于底除(//)的方法 mul,rmul 用于乘法(* )的方法 pow,rpow 用于指数(**)的方法 加法:
在对不同索引的对象进行算术运算时,如果希望当一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值比如0,可以通过算术方法进行填充,然后再相加。
上面的例子展示了,因为data5的行索引为3和列索引为列4用0填充后再相加所以行索引为3和列索引为列4的值是data4的值+0减法:
data4.sub(1)
乘法:
data4.mul(2)
除法:
三、统计运算
统计运算就是我们常用的数据集的求和、算平均值、最大值、最小值、绝对值、标准差等统计数据。在pandas中提供了丰富的统计函数可以方便的进行统计运算。
1、describe汇总描述统计
通过np.random.randn(1000,4)生成1000个正态分布的随机数据集看一下describe的汇总描叙统计。
包含了数据个数count、均值mean、标准差std、最小值min、最大值等。#1000个正态分布的随机数统计信息 data=pd.DataFrame(np.random.randn(1000,4)) data.describe()
2、统计函数
pandas常用统计函数如下:
data.max()
可以算出DataFrame中每一列的最大值
如果只需要计算某一列的最大值
data[1].max()
对单个函数进行统计的时候,坐标轴还是按照这些默认为columns(axis=0, default),如果要对index进行统计,则要指明(axis=1) 这里的axis取值与axis=0对应index,axis=1对应columns不同
- 使用0值表示沿着每一列或行标签\索引值向下执行方法
- 使用1值表示沿着每一行或者列标签模向执行对应的方法
如果要计算某一行的最大值
用data.loc[0].max()
,通过loc[]检索出需要统计的行,再用统计函数进行统计
累计统计cumsum,计算前n个数的和
四、自定义运算
如果常用的统计运算还不能满足,pandas提供了方法可以进行自定义运算。
apply(func, axis=0)
- func – 自定义函数 axis=0 – 默认是列(按行标签方向执行方法)
- axis=1为对行进行运算(按列标签方向执行方法)
如:自定义一个对列求max-min的函数
通过lambda匿名函数data.apply(lambda x: x.max() - x.min()) # lambda为匿名函数,x为自变量,冒号后面为函数表达式
通过自定义函数
#自定义函数 def maxdivmin(x): return x.max()-x.min()
至此,本文通过实例简单介绍了pandas数据分析的数据运算包括逻辑运算、算术运算、统计运算、自定义运算,也是平时在实际应用中常用的运算。数据集及源代码见:https://github.com/xiejava1018/pandastest.git
-
MySQL数据运算
2019-09-24 15:24:20数据查询不只是简单地返回数据库中存储的数据,还要根据业务需求对数据进行运算和筛选,以及确定以什么样的形式显示查询结果。 计算字段 通常情况下数据库中的原始数据并不是我们所需要的,一般需要我们在查询数据的...数据查询不只是简单地返回数据库中存储的数据,还要根据业务需求对数据进行运算和筛选,以及确定以什么样的形式显示查询结果。
计算字段
通常情况下数据库中的原始数据并不是我们所需要的,一般需要我们在查询数据的同时对数据进行运算和转换。
语法:select <表达式1>[,<表达式2>...<表达式n>] from <表名>;
示例:将每位员工的底薪增加500元
mysql> select empno,ename,sal,sal+500 from emp; +-------+--------+------+---------+ | empno | ename | sal | sal+500 | +-------+--------+------+---------+ | 7369 | smith | 800 | 1300 | | 7499 | allen | 1600 | 2100 | | 7521 | ward | 1250 | 1750 | | 7566 | jones | 2975 | 3475 | | 7654 | martin | 1250 | 1750 | | 7698 | blake | 2850 | 3350 | | 7782 | clark | 2450 | 2950 | | 7788 | scott | 3000 | 3500 | | 7839 | king | 5000 | 5500 | | 7844 | turner | 1500 | 2000 | | 7876 | adams | 1100 | 1600 | | 7900 | james | 950 | 1450 | | 7902 | ford | 3000 | 3500 | | 7934 | miller | 1300 | 1800 | +-------+--------+------+---------+
运算符
在MySQL中使用运算符进行运算,MySQL支持四种运算符,分别是算术运算符、比较运算符、逻辑运算符、位运算符。
算术运算符
SQL中最基本的运算符,对数值型数据执行算术运算。
算术运算符 说明 + 加法运算 - 减法运算 * 乘法运算 / 除法运算,返回商 % 求余运算,返回余数 比较运算符
SQL中最常用的运算符,用于比较或判断。
比较运算符 说明 = 等于 < 小于 <= 小于等于 > 大于 >= 大于等于 <=> 安全的等于,不会返回UNKNOWN <> 或!= 不等于 IS NULL 或 ISNULL 判断一个值是否为 NULL IS NOT NULL 判断一个值是否不为 NULL LEAST 当有两个或多个参数时,返回最小值 GREATEST 当有两个或多个参数时,返回最大值 BETWEEN AND 判断一个值是否落在两个值之间 IN 判断一个值是IN列表中的任意一个值 NOT IN 判断一个值不是IN列表中的任意一个值 LIKE 通配符匹配 REGEXP 正则表达式匹配 等于运算符“=”
等号“=”用来判断数字、字符串和表达式是否相等。如果相等,返回值为 1,否则返回值为 0。
- 若有一个或两个参数为NULL,则比较运算的结果为NULL。
- 若一个字符串和数字进行相等判断,则 MySQL 可以自动将字符串转换成数字。
安全等于运算符“<=>”
用于比较两个表达式的值。当两个表达式彼此相等或都等于空值时,比较结果为1;若其中一个是空值或者都是非空值但不相等时,则为0,不会出现NULL 的情况。
不等于运算符“<>”或者“!=”
用于数字、字符串、表达式不相等的判断。如果不相等,返回值为1;否则返回值为0,不能用于判断空值(NULL)。
IS NULL(或者 ISNULL)
用于检验一个值是否为NULL,如果为NULL,返回值为1;否则返回值为0。
IS NOT NULL
用于检验一个值是否为非NULL,如果为非NULL,返回值为1;否则返回值为0。
BETWWEN AND
语法:
<表达式> BETWEEN <最小值> AND <最大值>
若<表达式>大于或等于<最小值>,且小于或等于<最大值>,则 BETWEEN 的返回值为 1;否则返回值为 0。
LEAST
语法:
LEAST(<值1>,<值2>,…,<值n>)
存在两个或多个参数的情况下,返回最小值。若任意一个自变量为 NULL,则 LEAST() 的返回值为 NULL。
GREATEST
语法:
GREATEST (<值1>,<值2>,…,<值n>)
存在两个或多个参数的情况下,返回最大值。若任意一个自变量为 NULL,则 GREATEST() 的返回值为 NULL。
IN
用来判断操作数是否为 IN 列表中的一个值。如果是,返回值为 1;否则返回值为 0,不能用于判断空值(NULL)。
NOT IN
用来判断表达式是否为 IN 列表中的一个值。如果不是,返回值为 1;否则返回值为 0,不能用于判断空值(NULL)。
逻辑运算符
在SQL中,所有逻辑运算符求值结果均为1(TRUE)、0(FALSE)和 NULL。
逻辑运算符 说明 NOT 或者 ! 逻辑非 AND 或者 && 逻辑与 OR 或者 XOR 逻辑异或 NOT 或者 !
当操作数为 0 时,返回值为 1;当操作数为非零值时,返回值为 0;当操作数为 NULL 时,返回值为 NULL。
AND 或者 &&
当所有操作数均为非零值并且不为 NULL 时,返回值为 1;当一个或多个操作数为 0 时,返回值为 0;其余情况返回值为 NULL。
OR 或者 ||
当两个操作数均为非 NULL 值且任意一个操作数为非零值时,结果为 1,否则结果为 0;当有一个操作数为 NULL 且另一个操作数为非零值时,结果为 1,否则结果为 NULL;当两个操作数均为 NULL 时,所得结果为 NULL。
XOR
当任意一个操作数为 NULL 时,返回值为 NULL;对于非 NULL 的操作数,若两个操作数都不是 0 或者都是 0 值,则返回结果为 0;若一个为 0,另一个不为非 0,则返回结果为 1。
位运算符
用来对二进制字节中的位进行移位或者测试。
位或运算符“|”
将参与运算的两个数据按对应的二进制数逐位进行逻辑或运算。若对应的二进制位有一个或两个为 1,则该位的运算结果为 1,否则为 0。
位与运算符“&”
将参与运算的两个数据按对应的二进制数逐位进行逻辑与运算。若对应的二进制位都为 1,则该位的运算结果为 1,否则为 0。
位异或运算符“^”
将参与运算的两个数据按对应的二进制数逐位进行逻辑异或运算。对应的二进制位不同时,对应位的结果才为 1。如果两个对应位都为 0 或者都为 1,则对应位的结果为 0。
位左移运算符“<<”
使指定的二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用 0 补齐。
语法:表达式<<n
- n 指定值要移位的位数
位右移运算符“>>”
使指定的二进制值的所有位都右移指定的位数。右移指定位数之后,右边高位的数值将被移出并丢弃,左边低位空出的位置用 0 补齐。
语法:表达式>>n
- n 指定值要移位的位数。
位取反运算符“~”
将参与运算的数据按对应的二进制数逐位反转,即 1 取反后变 0,0 取反后变为 1。
运算符的优先级
运算符的优先级决定了不同的运算符在表达式中计算的先后顺序。
-
数据结构三要素——逻辑结构和物理结构与数据运算之间的关系
2020-05-08 00:44:20数据结构的三要素是:逻辑结构,物理结构,数据的运算。 逻辑结构: 分为线性结构个非线性结构。 线性结构就是有一一对应的关系的,如A-B-C,这三个字母就符合线性结构。 非线性结构就是集合,树,图。集合就是...数据结构的三要素是:逻辑结构,物理结构,数据的运算。
逻辑结构:
分为线性结构个非线性结构。
线性结构就是有一一对应的关系的,如A-B-C,这三个字母就符合线性结构。
非线性结构就是集合,树,图。集合就是一些元素共同归位一类,如自然数集合;树就是有层次关系结构,如家族谱系树;图就是每个元素之间会有联系,如一座城市的地铁图。
非常重要的一个细节就是:运算会和逻辑结构有关,和物理结构无关。
物理结构:
也就是元素如何存储的,即存储结构。
又分为顺序结构,链式结构,索引结构,散列结构。
这四种结构各有优缺点:顺序虽然可以实现直接存取,但是对于空间的利用不充分;链式虽然很好利用了空间,但是得到元素只能顺序存取,这样很不方便,并且还要有额外的空间给指针;索引虽然是结合了上面两种的优缺点,但额外的索引表增加了内存损耗;散列结构不可避免会有冲突的危险。
数据运算:
运算包括定义和实现。运算的定义是针对逻辑结构的,运算的实现是针对存储结构的。
举个例子:如果逻辑结构是线性的(A-B-C),物理结构是链式的(addr0[A]->addr2[B]->addr1[C]),运算的定义是找到B的前一个元素。B的前一个元素是A,但是如果实现起来,必须先找到addr0,再找addr2,确认了addr2中是B,就得到了A这个结果。但是如果这里的物理结构是顺序的,直接可以从addr0得到(B的前一个地址是addr0)。很明显两种不同的链式结构,同一种运算实现的方法是不同的。
-
pandas中的数据运算与算数运算
2018-08-05 20:25:13pandas中的数据运算与算数运算 一,DataFrame中的算数运算 对于DataFrame,对其会同时发生在行和列上,两个DataFrame对象相加后,其索引行和列会取并集,当一个对象中某轴标签在另一个对象上找不到时,会返回NaN.可... -
计算机数据运算的那点儿事
2018-09-01 19:28:53数据上的运算可以分为三大类:算术运算、移位运算和逻辑运算。 逻辑运算 逻辑运算很简单,相应的位照着真值表来操作就可以。 移位运算 移位运算移动模式中的位,改变为的位置。它们能向左或向右移动位。... -
计算机中的数据存储和数据运算
2015-05-22 15:29:41前几天看了一本计算机导论的书,对于我这个并非计算机科班出生的人很有启发,想迫不及待的把这些学到的东西总结起来,前面看过的主要内容是数据存储和数据运算,这篇博客也主要讲的是数据存储和数据运算。... -
Java位运算不一定比乘法快 (关于java数据运算的一些思考)
2019-06-03 00:26:56//乘法运算 long begin = System.currentTimeMillis(); int a = 256; System.out.println(a); for (int i =0;i<2000000000;i++) a = a * 356; long time =Sy... -
MATLAB数据及其运算(一)
2020-07-01 21:20:16MATLAB数据及其运算 MATLAB数据的特点: 矩阵是MATLAB最基本,最重要的数据类型,MATLAB的大部分运算或命令都是在矩阵运算的意义下执行的,而且这种运算定义在复数域上。向量和单个数据都可以作为矩阵的特例来处理。... -
C语言不同数据类型的混合运算
2020-02-26 11:38:591、在运算过程中,如果参与运算的数据类型不同时,数据将由低类型转化为高类型,即’A’由char类型转换为double类型;(存储长度较短的转换为存储长度较长的,且不丢失精度) 2、在赋值运算时,如果赋值号两边的数据... -
字符型数据进行算术运算
2021-01-16 11:20:12字符型数据进行算术运算,定义两个字符变量,通过对其进行加减运算,输出其对应的大写或小写字符,ascII 码的值。 #include <stdio.h> int main () { char ch1 , ch2; ch1 = 'a'; ch2 = 'B'; printf("ch1 ... -
c语言不同数据类型之间的运算(隐式转换、整型提升、强制类型转换、不同类型之间的运算)
2021-01-16 15:27:29然后执行表达式的运算。 上面的官方描述可以概括如下两点: 1.一个表达式中用到了整型值,那么类型为char、short int活整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象,都可以被放在这个整型变量... -
Pandas之数据框运算
2018-05-21 16:57:19数据框的简单计算:直接对字段进行加减乘除运算:from pandas import read_csv; import pandas as pd; df = read_csv("E:\\pythonlearning\\datacode\\firstpart\\4\\4.13\\data.csv", sep="|"...