数据模型是数学公式,算法是计算通过模型进行的操作步骤,优质的数据能提高算法的质量,数据结构是数据的存储方式。
pandas中的数据类型:
series:在人工智能中代表特征
数据结构实质为一行数据(在数据帧中看起来像是某一行的数据,但是在系列处理的时候,会以列进行处理,在数据帧中以行进行处理),其参数index是唯一的,与散列一样,不设置时以范围来按np.arange(n)中的顺序进行n次逐一传递,pd.Series(np.arange(10))这里是把numpy数组传入,只设置了data。pandas对象中用Series来处理,一般返回两列数据,左边一列是索引值,然后对应另一列是数组的元素
如果是a=pd.Series([1,5,3],index=[‘A’,‘B’,‘C’]),就是设置了data又设置了index,index要与data的元素数量一致
要想获取系列的数据信息:a【1】表示从a系列中找索引1的对应元素,这是通过位置找到他的数据
a【‘A’】表示从a系列中找index对应标签的元素,这是通过标签进行访问
dataframe:使用最多的结构,和表格类似
可以是异构数据(如:每列的数据类型都可以不一样)
其columns表示列标签,是对应每一列的,和index(对应每行的)一样的用法管理不同位置
交互式和打印式得到的数据帧结果看情况使用适合的
p=pd.DataFrame(a)把上面介绍的a系列放进去经过数据帧数据的处理也可以得到响应,因为数据帧的data能用系列
series创建dataframe(不能自定义设置列名):把多个系列装入一个空数据帧的时候,data加入的series表示数据帧的每一行,p=pd.DataFrame(【a,b,c】)其中的a,b,c要提前创建好其系列
系列在数据帧表示一行的数据,加入系列于数据帧中,如果没有按照加入后呈现出每一列都是同种数据的话,就会出现报错NaN(非数值),产生了缺失值
并且在数据帧中直接加系列,不能用columns=【‘A’,‘B’,‘C’】这个方法,否则也会出现缺失值
字典创建dataframe:p=pd.DataFrame({key:value}),其中的键是每列对应的columns,值就是一列的数据
数据增删改查:
查看列信息:
单列数据查看,查看p=pd.DataFrame(),p【‘name’】选择p中的columns标签为name的一列数据。
多列数据查看,这里需要用两个中括号来把所有列名括起来,表示被查看的参数,如果不括起,那么一个列名表示被查看的参数,而其他列名则会当作其他的参数来解读,但是格式又不对所以会报错。
列信息添加:
df[新列名] = 数据,比如p【‘key’】=value,新输入的数据需要和原始数据行数匹配,否则报错
列信息删除:(列表全删了就会只剩一列索引值)
df【列名】,比如p【‘key’】,直接删除某列名和其中一列的值
另一种删除方式:df.drop(列名),使用的时候a.drop(columns=‘name’)其中的inplace默认为flase,是不会真的删除某一列的,改成true才会生效,这里的labels=‘列名’,要使用的话要带上axis=1。因为axis默认为0,且这里pandas的axis赋值的0和1和numpy数组统计函数的方式相反,labels又是针对‘列’来进行操作的,所以axis要换为1。
查看行信息:
iloc【】通过索引找,df.iloc[3]找到索引为3的行信息
切片方式进行查找:查第1条到第4条数据,df.iloc【0:5】,0对应1,5不包括(退一位),切片完之后,得到的返回值其索引号都会进行重新编排
loc【】通过行设置好的行名称找
行添加:(数据来自不同数据库,行增加的方式进行统一整理,如ignore_index=True重新编排,行的名称)
append(新行数据,是否忽略索引(默认不忽略),是否显示行号相同时报错(默认不报))
通常情况下,行号都容易重叠,导致不能正常添加,所以要加入一个参数ignore_index=True改成忽略索引,b=a.append([‘awaq’,14],ignore_index=True),这种再赋值到另一个变量b的情况也可以解决重叠问题,不过索引号会出现重复,如0,1,2,1,2。如果再设置忽略索引重新编排就会变成0,1,2,3,4。
新行的数据如果是直接加一个系列进去,系列的处理不能设置columns,会另外加一列到数据帧里,其列的索引也是按照arange逐个传递
行删除:
drop()和列删除方法相似
drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False,
errors='raise’),列删除用columns,行删除用index,
df.drop(index=2)删除索引号为2的那行数据
外部数据获取:
以上介绍的基础方法只做了解,应用时肯定不是自己一个个地写数据进去的,利用好工具直接从外部获取数据进行调用、查看和处理。
如果含有中文路径,加上以下参数
encoding=‘utf-8’, engine=‘python’
读取csv或txt文件:
csv每行数据占一行信息,用逗号拆分,同样的内容,用csv存储所占用的空间更小
df=pd.read_csv(),括号内的参数filepath是csv文件路径,buffer是txt文件路径,能用…/相对路径,就尽量不用绝对路径,因为处理过程慢,
1、参数delimiter 分隔符,在文件内容里没有分隔符,又要分隔特征值的一些数据的时候,可以用到这个参数来替换
2、参数names 指定列名,使用列表装填
3、参数header =None表示没有第一行的标签(里面有对应着每列的名称),
所以说header里面的每个元素就是names(列名),delimiter是对应着各个数据的分隔符号,调用delimiter时就能替换成统一的符号来进行分隔了
例子:df=pd.read_csv(‘…/·路径.csv或txt(后缀不要忘记)’,delimiter=‘ :(自定义一种符号来替换文件中的分隔符号)’,header=None(设置None后就可以开始调用names进行定义列名),names=【‘z’,‘x’,‘··’·······】)
建立对象后,df.head(),其中head方法是查找数据中前5项的信息,为了不直接把所有内容都加载出来导致资源占用过多而浪费,有时分析处理数据可能需要调看的数据不用太多。
读取excel格式文件:
df=pd.read_excel(‘…/·路径.xls(后缀不要忘记),sheet_name=‘Sheet1’)
参数:sheet_name 读取的子表格(默认打开excel的第一给工作表,如果查看的信息不是第一个工作表,就需要进行切换),子表格有些是没写内容,没有数据的,所以要指定
数据查看:
df.head()head也能用于读取excel文件,看后五行的数据用tail,查看中间用切片,df.head(2:5)看索引2到4的切片,head封装了切片功能,在不使用这种功能时,他和tail都是使用默认功能
df.info()看列名和每列个数等一些数据信息(infomation),
df.describe()看数据描述,显示数据中的参数,把那些一整列为数值的标准差、最大值,中值(50%),四分位数值(25%和75%)等等显示出来。
显示某种信息的数据
df [ df [ 列名 ] == 数值 ] ,表示查找出某列名中,含有该数值的所有符合对象,全部显示出来
df [ df [ 列名 ].isin([ 数值, 数值]),表示查找某列名,含有数值1的符合对象或者符合数值2的对象两种符合任意一种都全部显示出来
df [ (df [ 列名 ] == 数值)&(df [ 列名 ] == 数值)] ,表示同时符合两种情况才能显示出来
与或非:&、|、~ , 里面的(df [ 列名 ] == 数值)执行出来的是bool值,加括号为了安排好运算的优先级
缺失值处理:(数据庞大时,肯定会有缺失值)
缺失值对数据模型(数学公式)有影响,比如NaN(not a number ,缺失值的标志)传入公式无法正常执行,缺失值不处理会造成数据模型无法进行计算。
方式:删除缺失值是最不好的,一般在外面采集或购买的数据,删除之后就会造成损失很多信息(有时其他和这部分有关的信息可能也要被处理)。
使用均值,中位值,最大最小值来填充,用来处理那些数据是数值的缺失值
升维处理,用来处理那些不是数值类型的缺失值数据,比如正反面的数据,缺失值显示没有正反面,这时可以先设置成未知的来填充,达到有数据显示就行。在项目中能做的性能比较好
使用模型进行缺失值的预测,使用会有风险,有时某些数据没有规律可言和其他数据又没关系,这样得到的效果就不好,在项目操作当中会使用。
• isnull() 是空值
执行后,有缺失值的坑位显示True,没缺失值的坑位显示Flase
• notnull() 非空值
执行后,没缺失值的坑位显示True,有缺失值的坑位显示Flase
• fillna() 填充缺失值
• dropna() 去除缺失值
缺失值在没有用isnull或notnull函数前,在坑位都是显示为NaN
numpy中的np.NaN,代表numpy包导入的缺失值
真实的场景中,数据量处理起来非常大,不能够一眼看出缺失值,所以就要用到函数来进行检测
df.isnull()有缺失值的坑位显示True
df【df.isnull()】把所有坑位都显示成NaN
df[df[‘age’].isnull()],把age列名中有缺失值的那一行都显示出来,而不显示其他行
notnull函数的也和以上的一样,进行非空(不是缺失值)的处理
查看数据缺失列的方式:
1、df.info()
执行后,显示每个列名和列名对应的有多少个非空值以及其他数据形式的数据信息
2、组合函数形式
df.isnull().sum(),把每个缺失值当作1,非缺失值当作0(bool值中flase为0,true为1),然后返回总和
只想看缺失值的列名:
df.columns【df.isnull().sum()>0】,sum大于0表示存在缺失值。
填充缺失值的简单操作:
df.fillna(3),里面还要设置参数inplace=True,否则不进行修改传入数据
pandas中很多函数都有inplace参数,他们都作是否修改传入数据的意思,为True时就是修改。但inplace还封装了一个作用,就是复制,在赋值的时候,其实赋值就是一种复制,inplace为True的时候,不进行复制操作。inplace还有一个意义就是原对象不迁移,属于不将映射转到其他变量或对象上。但为false的时候可以复制,赋值到的那个对象保留了原对象执行函数的一种映射,但不会改变原对象。所以这种方式就是为了保留原来数据的一种便捷方式,不用多次赋值来避免原来的对象改变又能得到一个长期的映射。
inplace这个参数设置好之后,即使是提前设置了原对象和新对象的浅复制,也一样不可撼动其执行效果,df1=df
有时为了填充好缺失值去为了找到中值等信息,可以用df.describe()来查看
去除缺失值的简单操作:
df.dropna(),执行后删除缺失值对应的一整行内容,而且其中也有inplace参数
数据统计:(pandas中统计为最核心的内容)
1、统计用方法
count() 统计值(数据总值)
df[‘age’].count(),统计某列名中有多少个数据(多少个索引)
sum() 数值和
df[‘age’].sum(),统计某列名中所有数值的总和
mean() 均值
std() 方差
min() 最小值
max() 最大值
value_counts() 频数统计
df[‘age’]. value_counts(),统计某列名中各个种类的数据以及对应数据出现的次数频率
sort_values([列名],ascending=[False],inplace=True)
ascending=[False]中用中括号括起,表示把里面的bool值当作对象来处理,True执行升序,False执行降序。
对单个列名操作的时候
af.sort_values(‘贷款金额’,ascending=True)
对多个列名操作的时候,要用中括号括起多个对象,而且每个列名都是一 一对应着设置的升序降序的方式
df.sort_values([‘贷款期限’,‘贷款金额’],ascending=[False,True])
多个列名排序的时候,放在中括号内靠左的先执行,然后依次传递往后执行的顺序
2、分组
df.groupby(列名)
按照某列名的一列上各个相同的数据以行的形式来进行分组
df.groupby([列名1,列名2])
多个列名以一组来分组的时候,是在原有一个列名的基础上再对应其他列名分配数据来进一步分组,这样分出的组数更多,数据都不一样的时候,可能两个列名进行的分组就能分到所有索引数的组了
df.groupby(列名).groups 查看分组
这里查看到的分组,显示的只是组名(以列中相同的数据集合的一个数据名)为键,对应的各个索引为值。查看多列名分组时,组是以一定顺序显示的
分组赋值要注意的问题:
df.groupby(列名)赋值是一个数组迭代器,df.groupby(列名).groups赋值就变成了一个字典从而失去数组的意义
3、聚合(分组后可以进行聚合的处理)
对已经分好的组进行再处理,把以行集合的组按列进行处理得到想要的数据
df.agg(np.mean)[‘贷款期限’],参数可以是np.mean等,不写括号。这里的np.mean是以映射对象表示,不作函数,所以不用加括号。
执行后得到组名和行里设置的列名里组中列数据的均值
3、过滤(分组后可以进行过滤的处理)
过滤根据定义的标准过滤数据并返回数据的子集
df.filter() 参数写方法或者lambda表达式
(1)写方法。
DataFrame.filter(items=None, like=None, regex=None, axis=None)
#items对列进行筛选#regex表示用正则进行匹配#like进行筛选#axis=0表示对行操作,axis=1表示对列操作
上面是直接对数组处理,以下是对数组分组后的再处理
(2)写lambda表达式
filter和匿名函数的使用,用来筛选groupby之后的数据。类似sql中groupby后的having
df1=df.groupby(‘列名’).filter(lambda x: x[‘age’].mean()>20)
结果会将所有某列名中数据>20的行其他列名选择age列名来筛选掉,返回所有其他值(在对分组后的行中选其他列的选择中也是用到了聚合的原理)。
数据映射:(将数据进行一定格式的转换)
map()接受任何Python函数,并且返回单个值,map() 会根据提供的函数对指定序列做映射
而映射在pandas中是非常实用的,不仅有inplace还有map来操作
三种修改数据的方式:
(1)lambda表达式(匿名函数的形式)
df【‘age’】=df[‘age’].map(lambda x : x+1),这里赋值来保存映射,赋值的对象是原对象df给df,那么就是真保存。赋值给其他对象就是不改变原对象,这里的X和过滤中使用lambda中的X一样是导入了列名传入的数据。
(2)导入函数
def fn(x):(x和lambda表达式一样是表示传入的参数)
if x>=0 and x<=60:
return “差”
else :
return ‘’不差‘’
df【‘score’】=df[‘score’].map(fn),这里接收fn自定义函数但又可以不改变原对象,但赋值原对象df给df,那么就是真保存(真实改变了原对象)。
(3)用字典进行处理
df【‘sex’】=df[‘sex’].map({‘M’,男}),以字典的形式去把为M的值改成男,然后进行映射