1 删除dataframe中有NAN的
这是使用字典创建DataFrame,key将作为表头
1.1 删除表中一行全为NAN的行
1.2 删除表中含有任何的NAN的行
1.3 删除表一列全为NAN的列
1.4 删除表中含有任何的NAN的列
删除表中某几列
直接用data.drop
data.drop(['Probability_test', 'Kmin_test', 'Kmax_test', 'action_test'], axis=1, inplace=True)
2 pandas中对列进行上下平移(shift)
通过shift函数里面的值来控制向上还是向下平移, 缺少的值会填充NaN,groupby函数里的参数控制基于什么字段进行shift。
2.1 上移shift(-1)
2.2 下移shift(1)
3. 批量读取文件夹中所有文件
通过os模块读取文件夹的所有文件
得到的a是一个list
对每个文件进行操作
用os.path.abspath()可以获取绝对路径
用os.path.join(domain,info)可以获取文件夹中每个文件的完整路径(绝对路径)
https://blog.csdn.net/brucewong0516/article/details/79062340
4. python tile函数
tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组
5.python中**运算符
5.1 矩阵间和np.array间的乘法运算
a和b是两个matrices,那么a*b,就是矩阵积
numpy里面arrays遵从逐个元素的运算,所以array:d 和e的d∗e运算相当于对应的元素相乘
5.2 **运算符
因为a是个matrix,所以a∗∗2返回的是a∗a,相当于矩阵相乘。而c是array,c∗∗2相当于,c中的元素逐个求平方。
6 min(0),max(0)的用法
7 分组求平均值(groupby)
依据Kmin,Kmax,Probability,action来计算reward的平均值
8 数据分组和聚合运算
pandas对象中的数据会根据你所提供的一个或多个键被拆分为多组,拆分操作是在对象的特定轴上执行的(groupby分组默认是在axis=0上进行分组的),然后将一个函数应用到各个分组并产生一个新值,最后所有这些函数的执行结果会被合并到最终的结果对象中。
8.1 groupby分组
这样生成了一个groupby对象,实际上还未进行任何计算,可对其调用方法进行计算
下面计算平均值
1.以key1为依据,对data1进行分组
求得平均值
2.可以将列名直接当作分组对象,分组中,数值列会被聚合,非数值列会从结果中排除
原始数据:
可以看到原来数据里面的key2是非数值列,被排除掉了
3.以多列分组求平均值
以key1和key2分组
4.使用groupby的size方法
可以返回一个含有分组大小的series
按key1的值和key2的值分组,并统计个数
原始数据:
首先根据key1,看a有三个,再根据key2排除了a two这个组合,剩下两个a one
8.2 对分组进行迭代
- groupby对象支持迭代,可以产生一组二元数组(由分组名称和数据块构成)
- 对于多重键的情况,元组的第一个元素将会是由键值组成的元组
- groupby分组默认是在axis=0上进行分组的,通过设置也可以在其他轴上进行分组
8.3 对部分列进行聚合
8.4 数据聚合
对于聚合,一般指的是能够从数组产生的标量值的数据转换过程,常见的聚合运算都有相关的统计函数快速实现,当然也可以自定义聚合运算
要使用自己的定义的聚合函数,需将其传入aggregate或agg方法即可
此处,将自定义的聚合函数传入agg中
8.5 分组运算和转换
聚合仅是分组运算的一种,它是数据转换的一个特例,本节介绍transform和apply方法,他们能够执行更多其他的分组运算
以下是为一个DataFrame添加一个用于存放各索引组平均值的列,利用了先聚合再合并
用merge合并
实际上可以对DataFrame进行transform方法,对比一下下面两种的区别,transform会将一个函数应用到各个分组
参考:https://www.cnblogs.com/splended/p/5278078.html
9 统计每个标签出现的次数
10 生成pandas数据
要生成pandas数据,先将其转换成字典,再通过pd.DataFrame(dict)方式转成pandas数据
lenses.txt数据:
11 fit()函数不能接收string类型数据
string数据序列化
可以看到报错,ValueError:could not convert string to float:'young'
因为在fit()函数不能接收string类型的数据,通过打印的信息可以看到,数据都是string类型的。在使用fit()函数之前,我们需要对数据集进行编码,这里可以使用两种方法:
LabelEncoder:将字符串转换为增量值
OneHotEncoder:使用One-of-K算法将字符串转换为整数
为了对string类型的数据序列化,需要先生成pandas数据,这样方便我们的序列化工作。这里我使用的方法是,原始数据->字典->pandas数据
数据序列化(需要导入LabelEncoder)
运行结果:
12 将两个含有字符串的集合取并集
13 reduce()函数会对参数序列中元素进行累积
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
14 拉普拉斯平滑和下溢出
利用贝叶斯分类器对文档进行分类时,要计算多个概率的乘积以获得文档属于某个类别的概率,即计算p(w0|1)p(w1|1)p(w2|1)。如果其中有一个概率值为0,那么最后的成绩也为0。
从上图可以看出,在计算的时候已经出现了概率为0的情况。如果新实例文本,包含这种概率为0的分词,那么最终的文本属于某个类别的概率也就是0了。显然,这样是不合理的,为了降低这种影响,可以将所有词的出现数初始化为1,并将分母初始化为2。这种做法就叫做拉普拉斯平滑(Laplace Smoothing)又被称为加1平滑,是比较常用的平滑方法,它就是为了解决0概率问题。
除此之外,另外一个遇到的问题就是下溢出,这是由于太多很小的数相乘造成的。学过数学的人都知道,两个小数相乘,越乘越小,这样就造成了下溢出。在程序中,在相应小数位置进行四舍五入,计算结果可能就变成0了。为了解决这个问题,对乘积结果取自然对数。通过求对数可以避免下溢出或者浮点数舍入导致的错误。同时,采用自然对数进行处理不会有任何损失。下图给出函数f(x)和ln(f(x))的曲线。
没有进行拉普拉斯平滑和下溢出操作之前
进行了拉普拉斯平滑和取对数防止下溢出操作后的
15 从txt文件中读取字符串,并将字符串转换为字符列表
正则表达式中,+代表重复1次至多次,*表示重复0次到多次 所以在切分的时候,如果正则表达是为r'W*',那就会见到非数字字母 零次或者多次就会切分 比如['ab cd ede?']切分后就是['a','b',' ','c','d',' ',' ','e','d',e','?'] 再加上后面的的语句return [ i for i in list if len(i)>2],因为每个字符串的长度都小于2,自然返回空集 把正则表达式改为r‘W+’就好啦
切分之后的
16 文本向量化
生成的returnVec长度与vocabList长度相同,遍历inputSet中的单词,并查找是否在词汇列表vocabList出现,出现的把该位置置为1,未出现的就是之前初始化0
17 从50个邮件中随机选出40个作为训练集,10个作为测试集
18 sorted排序
当待排序列表的元素由多字段构成时,我们可以通过sorted(iterable,key,reverse)的参数key来制定我们根据哪个字段对列表元素进行排序。
key=lambda 元素: 元素[字段索引]
例如:想对元素第二个字段排序,则
key=lambda y: y[1] 备注:这里y可以是任意字母,等同key=lambda x: x[1]
对字典进行排序
根据键的值进行倒序排序
首先运用items()获取字典的键值tuple列表,通过key来设定根据哪个字段进行排序
总之,排序,是要对列表排序,如果是对字典排序,需要将字典转换成键值对tuple列表的形式之后,再进行排序。
19 压缩与解压缩
注意要将数据打乱
20 if not
if not 就是一个判断语句,not 表示 非,
写成这个样子可能就理解了:
if not cond:
do_something()
意思就是如果 cond 为 “假值” (False,None,"" 等)时,执行分支里的语句。如果学过别的语言,比如 CC++ 等,上面的语句等价于:
if !cond {
do_something();
}
使用if not x这种写法的前提是:必须清楚x等于None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行。
在python中 None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()都相当于False。
21 Numpy的矩阵索引和array数组索引
矩阵索引使用[i,j]方式,数组索引使用[i][j]
22 getA()函数的作用
getA()函数与mat()函数的功能相反,是将一个numpy矩阵转换为数组
23 梯度上升算法原理解析
m为行数,代表有多少个样本;n为列数,代表有多少个特征。
n决定了weights的个数
24 Numpy中np.append()
numpy.append(arr, values, axis=None)
意思就是,将arr和values会重新组合成新的数组,作为返回值。axis是一个可选的值。
25 np.c_[xx.ravel(), y.ravel()]
np.c_[],组成矩阵(xx,yy对应位置配对)
xx.ravel()拉直,降低xx的维度,变成一行n列
26 np.vstack(x).reshape(-1,2)和np.squeeze(Y_c)
26.1 np.vstack(x)按照行顺序把数组垂直地堆叠起来
reshape(-1,2)n行2列(用-1表示n行)
26.2 np.squeeze(Y_c)
将向量数组转换为秩为1的数组
27 tf.reduce_mean(x, axis)
表示求取矩阵或张量指定维度的平均值。若不指定第二个参数,则在所有元素中取平均值;若指定第二个参数为0, 则在第一维元素上取平均值,即每一列求平均值;若指定第二个参数为1,则在第二维元素上取平均值,即每一行求平均值。
28 os.path.join()
表示把参数字符串按照路径命名规则拼接
29 np.sign
就是大于0的返回1.0
小于0的返回-1.0
等于0的返回0.0
30 Python中flatten, matrix.A用法
flatten的作用:返回一个折叠成一维的数组。
但是该函数只能适用于numpy对象,即array或者mat
你的xMat折叠成一维数组,而且是按A的方式,进行折叠,然后[0]是取第一个元素
a是个矩阵或者数组,a.flatten()就是把a降到一维,默认是按横的方向降
此时的a是个矩阵,降维后还是个矩阵,矩阵.A(等效于矩阵.getA())变成了数组,A[0]就是数组里的第一个元素
31 加载文本中数据的方法
当从文本中读取一行数据时候,数据的形式是这样的
这样的数据格式不符合要求,可以使用map方法
使用map方法
得到的数据形式:
32 Python中的size, shape, len, count
33 Python中列表,numpy中数组和矩阵的区别
Python中没有数组,只有元组和列表。
Python列表与numpy数组的区别
矩阵
数组
矩阵
数组
34 np.nonzero
np.nonzero(a)函数的作用:
将对矩阵a的所有非零元素, 分别安装两个维度, 一次返回其在各维度上的目录值。
因为矩阵只有一个非0值,在第0行,第0列
因为矩阵a只有两个非零值, 在第0行、第0列,和第1行、第0列。所以结果元组中,第一个行维度数据为(0,1) 元组第二个列维度都为(0,0)。
35 矩阵转为数组.A
36 将数组或矩阵转换成列表tolist()
37 Numpy在reshape函数中使用-1
Numpy 允许我们根据给定的新形状重塑矩阵,新形状应该和原形状兼容。有意思的是,我们可以将新形状中的一个参数赋值为-1。这仅仅表明它是一个未知的维度,我们希望 Numpy 来算出这个未知的维度应该是多少:Numpy 将通过查看数组的长度和剩余维度来确保它满足上述标准。让我们来看以下例子:
总而言之,当试图对一个张量进行 reshape 操作时,新的形状必须包含与旧的形状相同数量的元素,这意味着两个形状的维度乘积必须相等。当使用 -1 参数时,与-1 相对应的维数将是原始数组的维数除以新形状中已给出维数的乘积,以便维持相同数量的元素。
38 Numpy的argpartion函数:找到N个最大值的索引并返回N个值
Numpy 的 argpartion 函数可以高效地找到 N 个最大值的索引并返回 N 个值。在给出索引后,我们可以根据需要进行值排序。
39 Numpy中setdiff1d函数找到仅在A数组中有而B数组没有的元素
我们可以使用 Numpy extract () 函数从数组中提取符合条件的特定元素。
例子:模3
41 Numpy中clip函数是数组中的值保持在一定区间内
在很多数据处理和算法中(比如强化学习中的 PPO),我们需要使得所有的值保持在一个上下限区间内。Numpy 内置的 Clip 函数可以解决这个问题。Numpy clip () 函数用于对数组中的值进行限制。给定一个区间范围,区间范围外的值将被截断到区间的边界上。例如,如果指定的区间是 [-1,1],小于-1 的值将变为-1,而大于 1 的值将变为 1。
示例1:限制数组中的最小值为 2,最大值为 6
示例2:限制数组中的最小值为2,最大值为5
42 数组切片[:5:-1]的含义
a[2:7:2]表示从索引2开始到索引7停止,间隔为2
a[:5:-1],-1反转
冒号 : 的解释:如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。
43 time模块,计算当前时间和时间差
43.1 计算当前时间戳
https://blog.csdn.net/liuweiyuxiang/article/details/71075306
43.2 计算时间差
往前推5分钟
可以5*60=360s,计算时间戳的时候,再*1000转成毫秒级的
44 Numpy中用布尔值来替换值
Numpy可以运用布尔值来替换值
在数组中
在矩阵中
可以看到替换有个很有用的地方,就是可以替换那些空值
如,我们现在读取一个字符矩阵,其中有一个控制,其中的控制我们很有必要把它替换成其他值,可以用数据的平均值或者直接把它删除。
例:将空值替换成“0”的操作
45 Groupby详解
在日常的数据分析中,经常需要将数据根据某个(多个)字段划分为不同的群体(group)进行分析,如电商领域将全国的总销售额根据省份进行划分,分析各省销售额的变化情况,社交领域将用户根据画像(性别、年龄)进行细分,研究用户的使用情况和偏好等。在Pandas中,上述的数据处理操作主要运用groupby完成,这篇文章就介绍一下groupby的基本原理及对应的agg、transform和apply操作。
为了后续图解的方便,采用模拟生成的10个样本数据,代码和数据如下:
45.1 Groupby的基本原理
在Pandas中,实现分组操作的代码很简单,仅需一行代码,在这里,将上面的数据集按照company字段进行划分:
将上述代码输入ipython后,会得到一个DataFrameGroupBy对象
那这个生成的DataFrameGroupBy是啥呢?对data进行了groupby后发生了什么?ipython所返回的结果是其内存地址,并不利于直观地理解,为了看看group内部究竟是什么,这里把group转换成list的形式来看一看:
转换成列表的形式后,可以看到,列表由三个元组组成,每个元组中,第一个元素是组别(这里是按照company进行分组,所以最后分为了A,B,C),第二个元素的是对应组别下的DataFrame,整个过程可以图解如下:
总结来说,groupby的过程就是将原有的DataFrame按照groupby的字段(这里是company),划分为若干个分组DataFrame,被分为多少个组就有多少个分组DataFrame。所以说,在groupby之后的一系列操作(如agg、apply等),均是基于分组DataFrame的操作。理解了这点,也就基本摸清了Pandas中groupby操作的主要原理。下面来讲讲groupby之后的常见操作。
45.2 agg分组聚合
聚合操作是groupby后常见的操作,会写SQL的朋友对此应该是非常熟悉了。聚合操作可以用来求和、均值、最大值、最小值等,下面的表格列出了Pandas中常见的聚合操作。
针对样例数据集,如果我想计算不同公司员工的平均年龄和平均薪水,可以按照下方的代码进行:
如果想对针对不同的列求不同的值,比如要计算不同公司员工的平均年龄以及薪水的中位数,可以利用字典指定进行聚合操作:
45.3 transform
transform是一种什么数据操作?和agg有什么区别呢?为了更好地理解transform和agg的不同,下面从实际的应用场景出发进行对比。
在上面的agg中,我们学会了如何求不同公司员工的平均薪水,如果现在需要在原数据集中新增一列avg_salary,代表员工所在的公司的平均薪水(相同公司的员工具有一样的平均薪水),该怎么实现呢?如果按照正常的步骤来计算,需要先求得不同公司的平均薪水,然后按照员工和公司的对应关系填充到对应的位置,不用transform的话,实现代码如下:
如果使用transform的话,仅需要一行代码:
还是以图解的方式来看看进行groupby后transform的实现过程(为了更直观展示,图中加入了company列,实际按照上面的代码只有salary列):
图中的大方框是transform和agg所不一样的地方,对agg而言,会计算得到A,B,C公司对应的均值并直接返回,但对transform而言,则会对每一条数据求得相应的结果,同一组内的样本会有相同的值,组内求完均值后会按照原索引的顺序返回结果,如果有不理解的可以拿这张图和agg那张对比一下。
45.4 apply
apply应该是大家的老朋友了,它相比agg和transform而言更加灵活,能够传入任意自定义的函数,实现复杂的数据操作。在Pandas数据处理三板斧,你会几板?中,介绍了apply的使用,那在groupby后使用apply和之前所介绍的有什么区别呢?
区别是有的,但是整个实现原理是基本一致的。两者的区别在于,对于groupby后的apply,以分组后的分组DataFrame作为参数传入指定函数的,基本操作单位是DataFrame,而之前介绍的apply的基本操作单位是Series。还是以一个案例来介绍groupby后的apply用法。
假设我现在需要获取各个公司年龄最大的员工的数据,该怎么实现呢?可以用以下代码实现:
46 Pandas数据处理三板斧,map、apply和applymap
46.1 Series数据处理
46.1.1 map
数据集如下所示,各列分别代表身高、体重、是否吸烟、性别、年龄和肤色。
如果需要把数据集中gender列的男替换为1,女替换为0,怎么做呢?绝对不是用for循环实现!!!使用Series.map()可以很容易做到,最少仅需一行代码。
两种方法实现
- 使用字典映射
- 使用函数
那map在实际过程中是怎么运行的呢?请看下面的图解(为了方便展示,仅截取了前10条数据)
不论是利用字典还是函数进行映射,map方法都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值。
46.1.2 apply
同时Series对象还有apply方法,apply方法的作用原理和map方法类似,区别在于apply能够传入功能更为复杂的函数。怎么理解呢?一起看看下面的例子。
假设在数据统计的过程中,年龄age列有较大误差,需要对其进行调整(加上或减去一个值),由于这个加上或减去的值未知,故在定义函数时,需要加多一个参数bias,此时用map方法是操作不了的(传入map的函数只能接收一个参数),apply方法则可以解决这个问题。
可以看到age列都减了3,当然,这里只是简单举了个例子,当需要进行复杂处理时,更能体现apply的作用。
总而言之,对于Series而言,map可以解决绝大多数的数据处理需求,但如果需要使用较为复杂的函数,则需要用到apply方法。
46.2 Serie和DataFrame的区别
46.3 DataFrame数据处理
46.3.1 apply
对DataFrame而言,apply是非常重要的数据处理方法,它可以接收各种各样的函数(Python内置的或自定义的),处理方式很灵活,下面通过几个例子来看看apply的具体使用及其原理。
在进行具体介绍之前,首先需要介绍一下DataFrame中axis的概念,在DataFrame对象的大多数方法中,都会有axis这个参数,它控制了你指定的操作是沿着0轴还是1轴进行。axis=0代表操作对列columns进行,axis=1代表操作对行row进行,如下图所示。
如果还不是很了解,没关系,下面会分别对apply沿着0轴以及1轴的操作进行讲解,继续往下走。
假设现在需要对data中的数值列分别进行取对数和求和的操作,这时可以用apply进行相应的操作,因为是对列进行操作,所以需要指定axis=0,使用下面的两行代码可以很轻松地解决我们的问题。
实现的方式很简单,但调用apply时究竟发生了什么呢?过程是怎么实现的?还是通过图解的方式来一探究竟。(取前五条数据为例)
当沿着轴0(axis=0)进行操作时,会将各列(columns)默认以Series的形式作为参数,传入到你指定的操作函数中,操作后合并并返回相应的结果。
那如果在实际使用中需要按行进行操作(axis=1),那整个过程又是怎么实现的呢?
在数据集中,有身高和体重的数据,所以根据这个,我们可以计算每个人的BMI指数(体检时常用的指标,衡量人体肥胖程度和是否健康的重要标准),计算公式是:体重指数BMI=体重/身高的平方(国际单位kg/㎡),因为需要对每个样本进行操作,这里使用axis=1的apply进行操作,代码如下:
还是用图解的方式来看看这个过程到底是怎么实现的(以前5条数据为例)。
当apply设置了axis=1对行进行操作时,会默认将每一行数据以Series的形式(Series的索引为列名)传入指定函数,返回相应的结果。
总结一下对DataFrame的apply操作:
- 当axis=0时,对每列columns执行指定函数;当axis=1时,对每行row执行指定函数。
- 无论axis=0还是axis=1,其传入指定函数的默认形式均为Series,可以通过设置raw=True传入numpy数组。
- 对每个Series执行结果后,会将结果整合在一起返回(若想有返回值,定义函数时需要return相应的值)
当然,DataFrame的apply和Series的apply一样,也能接收更复杂的函数,如传入参数等,实现原理是一样的,具体用法详见官方文档。
46.3.2 applymap
applymap的用法比较简单,会对DataFrame中的每个单元格执行指定函数的操作,虽然用途不如apply广泛,但在某些场合下还是比较有用的,如下面这个例子。
为了演示的方便,新生成一个DataFrame
47 pickle
47.1 pickle保存
pickle 是一个 python 中, 压缩/保存/提取 文件的模块. 最一般的使用方式非常简单. 比如下面就是压缩并保存一个字典的方式. 字典和列表都是能被保存的.
wb 是以写的形式打开 ‘pickle_example.pickle’ 这个文件, 然后 pickle.dump 你要保存的东西去这个打开的 file. 最后关闭 file 你就会发现你的文件目录里多了一个 ‘pickle_example.pickle’文件, 这就是那个字典了
47.2 pickle提取
提取的时候相对简单点, 同样我们以读的形式打开那个文件, 然后 load 进一个 python 的变量.
48 Python字典的get()用法
作用
Python中的字典(Dictionary)是以键值对的形式存储数据的,get()方法可以返回指定键的值,如果该键不存在的话,返回默认值。
语法
dict.get(key, default=None)
参数
key:需要查找的键。
default:如果查找的键不存在的话,返回default的值。默认为None。
和dict[key]的区别
dict.get(key)和dict[key]在key值存在的情况下,都能得到对应的键值。但是当使用dict[key]时,key必须要存在,否则会报错。但是dict.get[key]中的key可以不存在,因为get方法有一个默认的参数None,当key不存在的时候,返回None。