当前位置: 首页 >数据库 > 数据分析三剑客之pandas模块

数据分析三剑客之pandas模块

pandas模块简介

1.基于Numpy构建2.pandas的出现,奠定了python数据分析领域的一哥地位pandas的主要功能	1.具备诸多功能的两大数据结构  	Series、DataFrame都是基于Numpy构建出来的	公司中使用频繁的是DataFrame,而Series是构成DataFrame的基础,即一个DataFrame可能由N个Series构成	2.集成时间序列功能	3.提供丰富的数学运算和操作(基于Numpy)	4.灵活处理缺失数据

下载

# python纯开发环境下pip3 install pandas# anaconda环境下conda install pandas'''anaconda已经自动帮助我们下载好了数据分析相关的模块,其实无需我们再下载'''

导入

import pandas as pd# 固定起别名的句式

数据结构之Series

# 是一种类似于一维数组对象,由数据和相关的标签(索引)组成第一种:pd.Series([4,5,6,7,8])  第二种:pd.Series([4,5,6,7,8],index=['a','b','c','d','e'])第三种:pd.Series({"a":1,"b":2})第四种:pd.Series(0,index=['a','b','c'])

缺失数据概念

st = {"tony":18,"yang":19,"bella":20,"cloud":21}obj = pd.Series(st)# 定义新索引new_st = {'tony','yang','cloud','jason'}# 修改原索引obj1 = pd.Series(st,index=a)# 查看数据变化obj1小疑问:为什么运算完之后数据类型会由原来的int64变成float64?	因为NaN其实是float类型	type(np.nan) 	结果是:float

处理缺失数据

dropna()  # 过滤掉值为NaN的行fillna()  # 填充缺失数据isnull()  # 返回布尔数组notnull()  # 返回布尔数组补充:  对数据进行处理返回一个新的结果原数据不变,如果想要直接影响原数据需要加参数inplace=True

布尔选择器

mask = pd.Series([True,False,False,True,False])price = pd.Series([321312,123,324,5654,645])price[mask]price|mask(price>200) & (price<900)price[(price>200) & (price<900)]  # 布尔求值

索引

sr1.iloc[1]  # 以索引下标解释sr1.loc[3]# 以标签解释

数据操作

res = pd.Series([...])res['aaa'] = 666res.iloc[0] = 888res.append(pd.Series([999],index=['cd']))res.set_value('cd',6969)del res['cd']

基本算术方法

"""addsubmuldiv"""sr1 = pd.Series([12,23,34], index=['c','a','d'])sr3 = pd.Series([11,20,10,14], index=['d','c','a','b'])sr1.add(sr3,fill_value=0)

数据结构之DataFrame(重要)

表格型数据结构,相当于一个二维数组,含有一组有序的列也可以看作是由Series组成的共用一个索引的字典第一种:res = pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})第二种:pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3],index=['b','a','c'])})第三种:pd.DataFrame(np.array([[10,20],[30,40]]),index=['a','b'],columns=['c1','c2'])更多pd.DataFrame([np.arange(1,8),np.arange(11,18)])s1 = pd.Series(np.arange(1,9,2))s2 = pd.Series(np.arange(2,10,2))s3 = pd.Series(np.arange(5,7),index=[1,2])df5 = pd.DataFrame({'c1':s1,'c2':s2,'c3':s3})"""以上创建方式都仅仅做一个了解即可因为工作中dataframe的数据一般都是来自于读取外部文件数据,而不是自己手动去创建"""

常用属性及方法

1.index行索引2.columns  列索引3.T	转置4.values值索引5.describe 快速统计

外部数据读取

文本文件读取

pd.read_csv(filepath_or_buffer, sep=',', header='infer', names=None, usecols=None, skiprows=None, skipfooter=None, converters=None, encoding=None)filepath_or_buffer:指定txt文件或csv文件所在的具体路径 sep:指定原数据集中各字段之间的分隔符,默认为逗号”,”	id	name	income1jason	 10header:是否需要将原数据集中的第一行作为表头,默认将第一行用作字段名称 如果原始数据没有表头需要将该参数设置为None names:如果原数据集中没有字段,可以通过该参数在数据读取时给数据框添加具体的表头 usecols:指定需要读取原数据集中的哪些变量名 skiprows:数据读取时,指定需要跳过原数据集开头的行数 有一些表格开头是有几行文字说明的,读取的时候应该跳过skipfooter:数据读取时,指定需要跳过原数据集末尾的行数 converters:用于数据类型的转换(以字典的形式指定) encoding:如果文件中含有中文,有时需要指定字符编码

基本使用

import pandas as pddata01 = pd.read_csv(r'data_test01.txt',skiprows = 2,  # python能自动过滤掉完全无内容的空行(写2、3都行)sep = ',',  # 默认就是逗号 写不写都行skipfooter = 3,)# 1.针对id原本是01、02自动变成了1、2...converters = {'id':str}# 2.点击文件另存修改文件编码之后再次读取出现乱码encoding='utf-8'# 3.移除收入千分位非逗号的其他符号thousands = '&'# 4.手动将文件表头行删除再次读取header = None  # 默认用索引names = ['id','year','month','day','gender','occupation','income']# 5.指定读取的字段usecols = ['id','income']"""查看方法帮助方式1	方法名?方式2	光标停留在方法名左括号后面	先按住shift键不松开,再按tab键(没反应就多按几次)"""

excel表格读取

pd.read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None, names=None,na_values=None, thousands=None, convert_float=True)io:指定电子表格的具体路径 sheetname:指定需要读取电子表格中的第几个Sheet,既可以传递整数也可以传递具体的Sheet名称 header:是否需要将数据集的第一行用作表头,默认为是需要的 skiprows:读取数据时,指定跳过的开始行数skip_footer:读取数据时,指定跳过的末尾行数 index_col:指定哪些列用作数据框的行索引(标签)na_values:指定原始数据中哪些特殊值代表了缺失值 thousands:指定原始数据集中的千分位符 convert_float:默认将所有的数值型字段转换为浮点型字段 converters:通过字典的形式,指定某些列需要转换的形式pd.read_excel(r'data_test02.xlsx', header = None,  names = ['ID','Product','Color','Size'],  converters = {'ID':str} )

数据库数据读取

# 在anaconda环境下直接安装# pymysql模块import pymysqlconn = pymysql.connect(host,port,user,password, database, charset)host:指定需要访问的MySQL服务器port:指定访问MySQL数据库的端口号 charset:指定读取MySQL数据库的字符集,如果数据库表中含有中文,一般可以尝试将该参数设置为 “utf8”或“gbk”user:指定访问MySQL数据库的用户名password:指定访问MySQL数据库的密码database:指定访问MySQL数据库的具体库名  # 利用pymysql创建好链接MySQL的链接之后即可通过该链接操作MySQLpd.read_sql('select * from user', con = conn)conn.close()  # 关闭链接

数据概览

df.columns  # 查看列 df.index  # 查看行df.shape	# 行列 df.dtypes  # 数据类型 df.describe  # 统计描述	默认只会统计数字类型的数据,非数字类型统计需要加参数include  sec_buildings.describe(include='object')df.head()  # 取头部多条数据df.tail()  # 取尾部多条数据

表格数据的行列操作

# 增df['info'] = '这些车都很好'df['desc'] = df['Sec_price'] * df['Km(W)']df.insert(1,'haha','你好')# 改df.rename(columns={'Brand':'品牌'})# 查df['Name']# 删df.drop(columns='haha',axis=1)axis=1表示列字段  axis=0表示行索引

查询指定的数据内容

# 获取单列数据df['Name']# 获取多列数据df[['Name','New_price','Sec_price']]# 获取Discharge是国4的所有数据项# df['Discharge'] == '国4'  # 布尔值df[df['Discharge'] == '国4']  # 布尔选择器# 获取品牌是众泰并且Discharge是国4的所有数据项# (df['Discharge'] == '国4') & (df['品牌'] == '众泰')  # 布尔值df[(df['Discharge'] == '国4') & (df['品牌'] == '众泰')]  # 布尔选择器# 获取品牌是众泰并且Discharge是国4的数据的品牌、Name、New_pricedf.loc[(df['Discharge'] == '国4') & (df['品牌'] == '众泰'),['品牌','Name','New_price']]# 如果针对筛选出来的数据还需要做字段的筛选处理 那么需要使用loc方法"""逻辑运算符连接的条件都必须使用括号括起来"""

数据类型处理

# 如何查看字段的数据类型df.dtypes# 通过dtypes查看字段的数据类型 将不符合条件的类型进行人为的修改操作# df['Boarding_time']# 当字段名存在的时候 不加赋值符号表示获取数据 加了赋值符号表示修改数据df['Boarding_time'] = pd.to_datetime(df['Boarding_time'],format='%Y年%m月')  # %Y %m %d %H %M %S %X# 将New_price字符串类型数据转换成数字类型的数据# 第一步要想办法将字符串万剔除################################### df['New_price'][:-1]# df['New_price'].replace('万','')# 上述两种方法都不能直接处理,如果需要处理需要先加一个内置方法str(固定用法)# df['New_price'].str[:-1]# df['New_price'].str.replace('万','')################################### 第二步将剩余的部分转换成数字df['New_price'] = df['New_price'].str[:-1].astype('float')

缺失值处理

isnullnotnullfillnadropna# 判断数据是否有缺失# data05.isnull()  # 当数据量特别大的时候还是不容易查看data05.isnull().sum()  # 通过sum求和 统计每个字段下缺失数据的个数# 计算缺失数据占比(绝对是否删除还是填充)data05.isnull().sum() / data05.shape[0]"""notnull与isnull刚好相反 这里不做过多的介绍"""# 删除缺失数据data05.shapedata05.dropna().shape"""针对缺失数据我们不能一味的删除,尤其是数据量本来就少的情况下,再删除数据会导致资源的浪费所以有时候针对缺失数据我们会采取填充的策略,将缺失数据补全"""data05.fillna(value=666)  # 虽然fillna可以填充数据  但是我们在填充数据的时候不能鲁莽的填充相同的值####################################################### 应该遵循不同类别的缺失采取不同的填充策略data05.fillna(value = {  'gender':data05.gender.mode()[0],  # 众数:可以有一个也可能是多个  'age':data05.age.mean(),  # 平均值  'income':data05.income.median()  # 中位数})######################################################

透视表

我们在学习excel操作的时候都接触过透视表	本质其实就将一张表按照一定的条件和需求做成另外一张表data06 = pd.read_csv(r'diamonds.csv')data06.head()# 按照颜色分类 之后求解每一个分类下价格的平均值# pd.pivot_table(data06, index = 'color', values='price', aggfunc='mean')# 先按照颜色分类 之后再每个颜色分类下 再按照clarity分组 之后求解价格的个数(商品个数)pd.pivot_table(data06, index = 'color', columns='clarity', values='price', aggfunc='size')

分组与聚合

分组	按照给定的条件将单个单个的数据组织到一起形成一个一个的整体聚合	针对分组之后的整体进行数学统计计算# MySQL好好复习# 按照颜色分组# data06.groupby(['color']).groups# 按照颜色分组 并统计每个颜色下的商品数量 和 平均价格data06.groupby(['color']).aggregate({'color':'size','price':'mean'})# 分组的依据可以有多个grouped = data06.groupby(by = ['color','cut'])  # 先按照颜色分组 再按照cut分组# 对分组变量进行统计汇总result = grouped.aggregate({'color':np.size, 'carat':np.min, 'price':np.mean, 'table':np.max})result# 针对分组之后的字段展示 我们可以自定义顺序 也可以在计算的时候就安排好顺序# 调整变量名的顺序result = pd.DataFrame(result, columns=['price','color','carat','table'])result# 数据集重命名result.rename(columns={'color':'个数','carat':'最小重量','price':'平均价格','table':'最大面积'})

统计NBA夺冠次数

# 如何获取网页球队数据"""pd.read_html()	类似于爬虫,能够爬取页面数据,并且将页面上的table标签里面的数据全部提取出来"""如果你的机器执行上述代码报错不要慌张,冷静下来分析,或者直接百度搜索,锻炼自我解决问题的能力,不要遇到问题对他人产生依赖

数据的纵向合并(扩展数据)

# 注意:纵向合并表数据需要确保字段名一致pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None)objs:指定需要合并的对象,可以是序列、数据框或面板数据构成的列表 axis:指定数据合并的轴,默认为0,表示合并多个数据的行,如果为1,就表示合并多个数据的列join:指定合并的方式,默认为outer,表示合并所有数据,如果改为inner,表示合并公共部分的数据 join_axes:合并数据后,指定保留的数据轴 ignore_index:bool类型的参数,表示是否忽略原数据集的索引,默认为False,如果设为True,就表示忽略原索引并生成新索引keys:为合并后的数据添加新索引,用于区分各个数据部分# 构造数据集df1和df2df1 = pd.DataFrame({  'name':['张三','李四','王二'],'age':[21,25,22],'gender':['男','女','男']})df2 = pd.DataFrame({  'name':['丁一','赵五'],'age':[23,22],'gender':['女','女']})# 数据集的纵向合并pd.concat([df1,df2] , keys = ['df1','df2'])  # 加keys参数可以在合并之后看到数据来源pd.concat([df1,df2] , keys = ['df1','df2']).reset_index() pd.concat([df1,df2] , keys = ['df1','df2']).reset_index().drop(labels ='level_1', axis = 1).rename(columns = {'level_0':'Class'})# 如果df2数据集中的“姓名变量为Name”df2 = pd.DataFrame({  'Name':['丁一','赵五'],'age':[23,22],'gender':['女','女']})# 数据集的纵向合并pd.concat([df1,df2])# concat行合并,数据源的变量名称完全相同(变量名顺序没有要求)

数据的横向合并(连接表)

# 与我们在MySQL阶段学习的连接表一模一样"""inner joinleft joinright join"""pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'))left:指定需要连接的主 right:指定需要连接的辅表how:指定连接方式,默认为inner内连,还有其他选项,如左连left、右连right和外连outer on:指定连接两张表的共同字段left_on:指定主表中需要连接的共同字段right_on:指定辅表中需要连接的共同字段 left_index:bool类型参数,是否将主表中的行索引用作表连接的共同字段,默认为False right_index:bool类型参数,是否将辅表中的行索引用作表连接的共同字段,默认为False sort:bool类型参数,是否对连接后的数据按照共同字段排序,默认为False suffixes:如果数据连接的结果中存在重叠的变量名,则使用各自的前缀进行区分# 构造数据集df3 = pd.DataFrame({  'id':[1,2,3,4,5],  'name':['张三','李四','王二','丁一','赵五'],  'age':[27,24,25,23,25],  'gender':['男','男','男','女','女']})df4 = pd.DataFrame({  'Id':[1,2,2,4,4,4,5],'score':[83,81,87,75,86,74,88],'kemu':['科目1','科目1','科目2','科目1','科目2','科目3','科目1']})df5 = pd.DataFrame({  'id':[1,3,5],  'name':['张三','王二','赵五'],  'income':[13500,18000,15000]})# 首先df3和df4连接merge1 = pd.merge(left = df3,right = df4,how = 'left',left_on='id',right_on='Id')# 再将连接结果与df5连接merge2 = pd.merge(left = merge1,right = df5,how = 'left')

作者:孔夫子挂妖刀
来源链接:https://www.cnblogs.com/w7777/p/14603579.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/database/117351.html

标签:group by
分享给朋友:

“数据分析三剑客之pandas模块” 的相关文章

JDBC工具类(DButil) 2022年05月13日 09:13:25
MYSQL的存储过程 2022年05月16日 21:54:19
mysql 查询数据库内存大小 2022年06月06日 11:11:26
mysql递归查询 2022年06月06日 18:26:30
如何查看MySQL的版本? 2022年06月11日 22:08:01
MYSQL查询一个月前的数据 2022年06月12日 09:48:55
查询mysql中user表 2022年06月12日 18:08:24