Python学习日记-pandas操作学习
Python学习日记-pandas模块学习
- 根据需求筛选数据
- 绘制柱状图-利用pandas绘制
- 绘制柱状图-利用matplotlib绘制
- 绘制柱状图-两组数据比较
- 绘制柱状图-叠加柱状图
- 绘制饼状图
- 绘制折线图
- 绘制散点图
- 绘制直方图
- 绘制密度图和打印相关性
- 联立两张sheet
- 进行数据验证
- 进行数据拆分
- 按行/列求和/均值
- 删除表中重复的数据
- 表格转置
- 读取csv/tsv/txt文件成dataframe
- 数据透视表
- 根据原始数据拟合曲线
- 数据行的增、删、改、插入
- 数据列的增、删、改、插入、并联、串联
- 对列数据进行复杂的计算
- Series取值的方法
根据需求筛选数据
# Company:ZTE
# Author:Wanle
# Time:2020/9/28 0028 10:04
import pandas as pd #导入pandas模块并命名为pd
def age_18_to_30(age): #定义年龄在18-30岁之间学生的函数return 18<=age<30
def leave_A(score): #定义分数在85-100之间的成绩为A类的学生return 85<=score<=100
stu=pd.read_excel('E:\\工作日志\\Python\\ExcelResource\\filter.xlsx',index_col='ID') #读取Excel中的数据并以表格中的ID列作为索引
stu=stu.loc[stu['Age'].apply(age_18_to_30)] #利用loc函数取数据,取到的数据是一个新的dataframe,apply()中直接给函数名即可
stu=stu.loc[stu.Age.apply(age_18_to_30)] #这种写法也可以
stu=stu.loc[stu['Age'].apply(age_18_to_30)].loc[stu['Score'].apply(leave_A)] #筛选出年龄在18~30岁之间成绩在85~100分之间的学生
stu=stu.loc[stu['Age'].apply(lambda age:18<=age<30)].loc[stu['Score'].apply(lambda score:85<=score<=100)] #用lambda表达式也可
print(stu)
绘制柱状图-利用pandas绘制
# Company:ZTE
# Author:Wanle
# Time:2020/10/6 0006 21:25
import pandas as pd
import matplotlib.pyplot as pl
stu=pd.read_excel('E:\\工作日志\\Python\\ExcelResource\\field.xlsx')
stu.sort_values(by='Number',inplace=True,ascending=False) #按Number列进行升序排序,且不生成新的dataframe
stu.plot.bar(x='Field',y='Number',color='orange',title='Students Field') #以Field为横轴,Number为纵轴绘图,以橘黄色填充柱状图
pl.show()
绘制柱状图-利用matplotlib绘制
# Company:ZTE
# Author:Wanle
# Time:2020/10/6 0006 21:25
import pandas as pd
import matplotlib.pyplot as pl
stu=pd.read_excel('E:\\工作日志\\Python\\ExcelResource\\field.xlsx')
stu.sort_values(by='Number',inplace=True,ascending=False) #按Number列进行升序排序,且不生成新的dataframe
pl.bar(stu.Field,stu.Number,color='orange') # 绘制柱状图
pl.xticks(stu.Field,rotation='90') # 将横坐标标签旋转90度
pl.xlabel('Field') # 给柱状图添加横标签
pl.ylabel('Number') # 给柱状图添加纵标签
pl.title('Students Field',fontSize=16) # 给柱状图添加标题
pl.show()
绘制柱状图-两组数据比较
# Company:ZTE
# Author:Wanle
# Time:2020/10/8 0008 10:30
import pandas as pd
import matplotlib.pyplot as pl
stu=pd.read_excel('E:\\工作日志\\Python\\ExcelResource\\compare.xlsx')
stu.sort_values(by='2016Year',inplace=True,ascending=True)
stu.plot.bar(x='Field',y=['2016Year','2017Year'],color=['green','red']) #设置两组数据对比作图
pl.title('Students Field',fontsize=16) #设置图标标题和字体大小
pl.xlabel('Field') #设置横坐标标签
pl.ylabel('Number') #设置纵坐标标签
pl.gca().set_xticklabels(stu.Field,rotation='45',ha='right') #旋转纵坐标45度
pl.gcf().subplots_adjust(left=0.2,bottom=0.4)
pl.show()
绘制柱状图-叠加柱状图
# Company:ZTE
# Author:Wanle
# Time:2020/10/8 0008 11:07
import pandas as pd
import matplotlib.pyplot as pl
user=pd.read_excel('E:/工作日志/Python/ExcelResource/overlay.xlsx',index_col='ID')
user['Total']=user['Oct']+user['Nov']+user['Dec'] #在dataframe中新添加一列求和列
user.sort_values(by='Total',inplace=True,ascending=False) #按求和列降序排序
user.plot.bar(x='Name',y=['Oct','Nov','Dec'],stacked=True) #垂直柱状图-stacken属性表示是否叠加
user.plot.barh(x='Name',y=['Oct','Nov','Dec'],stacked=True) #水平柱状图-stacken属性表示是否叠加
pl.show()
print(user)
绘制饼状图
# Company:ZTE
# Author:Wanle
# Time:2020/10/8 0008 12:28
import pandas as pd
import matplotlib.pyplot as pl
stu=pd.read_excel('E:/工作日志/Python/ExcelResource/pie.xlsx',index_col='Name') #以Name列作为饼状图每部分的标签
stu['Number'].plot.pie(fontsize=8,counterclock=True) #以Number列绘制饼状图counterclock=True表示顺时针旋转
pl.ylabel('Number')
pl.title('Student',fontsize=16)
pl.show()
print(stu)
绘制折线图
# Company:ZTE
# Author:Wanle
# Time:2020/10/8 0008 17:16
import pandas as pd
import matplotlib.pyplot as pl
week=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Orders.xlsx',index_col='Week')
print(week)
print(week.columns)
week.plot(y=['Accessories', 'Bikes', 'Clothing', 'Components']) #绘制折线图
week.plot.area(y=['Accessories', 'Bikes', 'Clothing', 'Components']) #绘制叠加折线图
pl.title('Sale Weekly Trand',fontsize=16)
pl.ylabel('Total',fontsize=8,fontweight='bold')
pl.xticks(week.index,fontsize=6)
pl.show()
绘制散点图
# Company:ZTE
# Author:Wanle
# Time:2020/10/8 0008 17:53
import pandas as pd
import matplotlib.pyplot as pl
pd.options.display.max_columns=999 #列太多,参数可以全部列信息,不设置该参数部分列信息在控制台打印时会被折叠
homes=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/home_data.xlsx')
print(homes.head()) #打印读取到信息的头几行数据
homes.plot.scatter(x='sqft_living',y='price') #绘制散点图
pl.title('HomeData',fontsize=8,fontweight='bold')
homes.plot.scatter(x='price',y='sqft_living')
pl.title('HomeData',fontsize=8,fontweight='bold')
pl.show()
绘制直方图
# Company:ZTE
# Author:Wanle
# Time:2020/10/8 0008 21:12
import pandas as pd
import matplotlib.pyplot as pl
homes=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/home_data.xlsx')
homes.sqft_living.plot.hist(bins=100) #以sqft_living列绘制直方图,每个直方图以100为间隔
pl.xticks(range(0,max(homes.sqft_living),500),fontsize=8,rotation=90) #横坐标以500为间隔标注
pl.show()
绘制密度图和打印相关性
# Company:ZTE
# Author:Wanle
# Time:2020/10/8 0008 21:12
import pandas as pd
import matplotlib.pyplot as pl
homes=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/home_data.xlsx')
homes.sqft_living.plot.hist(bins=100) #以sqft_living列数据绘制直方图,每个直方图以100为间隔
pl.xticks(range(0,max(homes.sqft_living),500),fontsize=8,rotation=90) #横坐标以500为间隔标注
homes.sqft_living.plot.kde() #以sqft_living列数据绘制密度图,纵坐标为密度即横坐标值对应发生的概率
pl.xticks(range(0,max(homes.sqft_living),500),fontsize=8,rotation=90) #横坐标以500为间隔标注
pl.show()
pd.options.display.max_columns=999 #列太多,参数可以全部列信息,不设置该参数部分列信息在控制台打印时会被折叠
print(homes.corr()) #打印各因素之间的相关性
联立两张sheet
# Company:ZTE
# Author:Wanle
# Time:2020/10/11 0011 21:27
import pandas as pd
import matplotlib.pyplot as pl
students=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Student_Score.xlsx',sheet_name='Students') #读取Students sheet
scores=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Student_Score.xlsx',sheet_name='Scores')
table=students.merge(scores,on='ID') #以Students表ID和Scores表ID联立成一个新的表
table=students.merge(scores,on='ID',how='left').fillna(0) #以左边的表为标准联立成新表,没有联立的数据设置为0
table.Score=table.Score.astype(int) #将新表中的Score列数据类型设置为int
table=students.join(scores,on='ID') #也可以使用join函数进行联立
print(table)
进行数据验证
# Company:ZTE
# Author:Wanle
# Time:2020/10/11 0011 22:12
import pandas as pd
import matplotlib.pyplot as pl
def score_validation1(row): #抛异常的方式try:assert 0<=row.Score<=100 #assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常except:print('#{0} student {1} has an invalid score {2}'.format(row.ID,row.Name,row.Score))def score_validation2(row): #用判断语句的方式if not 0<=row.Score<=100:print('#{0} student {1} has an invalid score {2}'.format(row.ID, row.Name, row.Score))stu=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Students.xlsx')
stu.apply(score_validation1,axis=1) #axis=1,表示按行对数据进行操作,axis=0,表示按列对数据进行操作
进行数据拆分
# Company:ZTE
# Author:Wanle
# Time:2020/10/12 0012 8:09
import pandas as pd
employees=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Employees.xlsx')
df_temp=employees['Full Name'].str.split(pat=' ',expand=True) #pat属性表示根据什么符号划分 expand=True表示将划分的结果分列表示
employees['First Name']=df_temp[0] #在employees新增First Name列
employees['Last Name']=df_temp[1] #在employees新增Last Name列
print(employees)
按行/列求和/均值
# Company:ZTE
# Author:Wanle
# Time:2020/10/12 0012 14:13
import pandas as pd
students=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Students.xlsx',index_col='ID')
temp=students[['Test_1','Test_2','Test_3']] #将表中的三列数据组成新的dataframe
row_sum=temp.sum(axis=1) #按行进行求和,axis=1表示按行操作,axis=0表示按列操作
row_mean=temp.mean(axis=1) #按行进行求均值,axis=1表示按行操作,axis=0表示按列操作
students['Total']=row_sum #将求和结果添加到原students表中
students['Average']=row_mean #将求均值结果添加到原students表中
col_mean=students[['Test_1','Test_2','Test_3','Total','Average']].mean() #按列求均值,不指定axis,默认为0
col_mean['Name']='Summary' #设置col_mean行的名称
students=students.append(col_mean,ignore_index=True) #将col_mean行添加到原students表中
print(students)
删除表中重复的数据
# Company:ZTE
# Author:Wanle
# Time:2020/10/12 0012 19:28
import pandas as pd
students=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Students_Duplicates.xlsx')
repeat=students.duplicated(subset='Name') #扫描表中所有数据将重复度额数据标记成True,未重复的为False,组成Series
repeat_ID=repeat[repeat==True] #在repeat中筛选出repeat值为True的所有数据组成新的Series:repeat_ID
repeat_students=students.iloc[repeat_ID.index] #在students表中以repeat_ID.index来定位重复的学生信息
students.drop_duplicates(subset='Name',inplace=True,keep='first') #删除原表中Name重复的数据,keep='first'表示保留前面的重复数据
print(students)
表格转置
# Company:ZTE
# Author:Wanle
# Time:2020/10/12 0012 21:32
import pandas as pd
pd.options.display.max_columns=999
video=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Videos.xlsx',index_col='Month')
table=video.transpose() #将表格转置
print(table)
读取csv/tsv/txt文件成dataframe
# Company:ZTE
# Author:Wanle
# Time:2020/10/12 0012 21:51
import pandas as pd
table1=pd.read_csv('E:/工作日志/Python/ExcelResource/资料/Students.csv',index_col='ID') #将csv文件读取成为dataframe
table2=pd.read_csv('E:/工作日志/Python/ExcelResource/资料/Students.tsv',sep='\t',index_col='ID') #将tsv文件读取成为dataframe
table3=pd.read_csv('E:/工作日志/Python/ExcelResource/资料/Students.txt',sep='\t',index_col='ID') #将txt文件读取成为dataframe
数据透视表
# Company:ZTE
# Author:Wanle
# Time:2020/10/13 0013 7:54
import pandas as pd
import numpy as np
pd.options.display.max_columns=999
orders=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Orders2.xlsx')
orders['Year']=pd.DatetimeIndex(orders['Date']).year #根据orders表格中的日期获取对应年份并添加为orders的新列
#使用pandas自带的pivot_table方法制作透视表
pt1=orders.pivot_table(index='Category',columns='Year',values='Total',aggfunc=np.sum) #数据透视表,index对应Excel中的rows,aggfunc=np.sum表示采用求和的函数
print(pt1)
#使用分组的方法制作透视表
groups=orders.groupby(['Category','Year']) #将orders以Category和Year进行分组
s=groups['Total'].sum() #对groups的Total进行求和
c=groups['ID'].count() #对groups的ID进行统计
pt2=pd.DataFrame({'Summary':s,'Count':c}) #将s和c组成一个新的DataFrame
print(pt2)
writer=pd.ExcelWriter('E:/工作日志/Python/ExcelResource/newtb.xlsx') #为将两个dataframe保存到一个Excel中需要创建一个writer对象
pt1.to_excel(writer,sheet_name='pt1') #将pt1保存到newtb.xlsx
pt2.to_excel(writer,sheet_name='pt2') #将pt2保存到newtb.xlsx
writer.save() #保存
writer.close() #关闭writer对象
根据原始数据拟合曲线
# Company:ZTE
# Author:Wanle
# Time:2020/10/13 0013 20:51
import pandas as pd
import matplotlib.pyplot as pl
import scipy.stats as sci
sales=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Sales.xlsx',dtype={'Month':str}) #将读取到的数据全部转换为字符串类型
slope,intercept,r,p,std_err=sci.linregress(sales.index,sales['Revenue']) #拟合出线形函数的相关参数,slope,intercept,std_err依次是斜率、截距、标准
exp=slope*sales.index+intercept #定义拟合的函数公式
pl.scatter(sales.index,sales['Revenue']) #利用原始数据绘制散点图
pl.plot(sales.index,exp,color='red') #利用拟合出的函数公式绘制拟合曲线
pl.xticks(sales.index,sales['Month'],rotation=90) #设置横坐标的样式
pl.title(f'y={round(slope,4)}*x+{round(intercept,4)}') #设置标题
pl.show()
数据行的增、删、改、插入
# Company:ZTE
# Author:Wanle
# Time:2020/10/13 0013 22:22
import pandas as pd
page1=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Students.xlsx',sheet_name='Page_001')
page2=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Students.xlsx',sheet_name='Page_002')
#将page2的内容接到到page1表中内容的后面,并重新设置新的index,删除原来的额index
new_page=page1.append(page2).reset_index(drop=True)
#在new_page内容的末尾添加新的一行内容
new_row1=pd.Series({'ID':41,'Name':'Tom','Score':100}) #创建新的一行
new_page=new_page.append(new_row1,ignore_index=True) #在new_page末尾附加新行并忽略其index
#修改new_page某行的数据内容(方法1:直接修改非替换操作)
new_page.at[36,'Name']='Tony'
new_page.at[36,'Score']=97
#修改new_page某行的数据内容(方法2:替换操作)
new_row2=pd.Series({'ID':24,'Name':'Jack','Score':89}) #创建新的一行
new_page.iloc[24]=new_row2 #定位到index=24这行并将new_row2赋给这行
#在new_page的某两行数据之间插入一行数据(切片方法)
new_row3=pd.Series({'ID':101,'Name':'Anny','Score':92})
part1=new_page[:20]
part2=new_page[20:]
new_page=part1.append(new_row3,ignore_index=True).append(part2).reset_index(drop=True)
#删除new_page中的某几行数据,并不生成新的dataframe
new_page.drop(index=[7,9,28],inplace=True)
#删除new_page中Name为空的学生数据
missing=new_page.loc[new_page['Name']==''] #筛选出Name为空的的学生信息
new_page.drop(index=missing.index,inplace=True) #在原表中删除Name为空的的学生信息
new_page=new_page.reset_index(drop=True) #刷新index
print(new_page)
数据列的增、删、改、插入、并联、串联
# Company:ZTE
# Author:Wanle
# Time:2020/10/14 0014 21:59
import pandas as pd
import numpy as np
page1=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Students.xlsx',sheet_name='Page_001')
page2=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Students.xlsx',sheet_name='Page_002')
new_page1=pd.concat([page1,page2],axis=0) #将两张表串联在一起(即上下衔接按列操作)
new_page2=pd.concat([page1,page2],axis=1) #将两张表并联在一起(即左右衔接按行操作)
new_page1['newRow']=np.arange(0,len(new_page1)) #给表格新增一列
new_page1.drop(columns=['newRow','Score'],inplace=True) #删除表格中的两列
new_page1.insert(1,column='Insert',value=np.arange(0,len(new_page1))) #在第一列之前插入新列
new_page1.rename(columns={'Insert':'InsertRow','Name':'NameModify'},inplace=True) #修改列名
new_page1.dropna(inplace=True) #只要某个单元格内容为空即删除该单元格所在的行数据
print(new_page1)
对列数据进行复杂的计算
# Company:ZTE
# Author:Wanle
# Time:2020/10/15 0015 8:04
import pandas as pd
import numpy as np
def get_circumcircle_area(l,h):r=np.sqrt(l*l+h*h)/2return round(np.pi*r*r,3)
rectangle=pd.read_excel('E:/工作日志/Python/ExcelResource/资料/Rectangles.xlsx',index_col='ID')
rectangle['CA']=rectangle.apply(lambda row:get_circumcircle_area(row['Length'],row['Height']),axis=1)
print(rectangle)
Series取值的方法
Series.iloc[0]#以下标取值,(索引值为0的)
Series.iloc[0]#以标签取值(index值为0)
Python学习日记-pandas操作学习相关推荐
- 正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
正则表达式学习日记_<学习正则表达式>笔记_Mr_Ouyang 所属分类: 正则表达式学习日记 书名: 学习正则表达式 作者: Michael Fitzgerald 译者 ...
- CUMT学习日记——Verilog课程学习全记录
CUMT学习日记--Verilog课程学习全记录 系列第一篇 计算机网络复习 系列第二篇 计算机组成原理复习 系列第三篇 微机原理与接口技术复习 系列第四篇 计算机操作系统复习 系列第五篇 数据库原理 ...
- Python模块之Pandas模块学习笔记
目录 一.模块的安装 二.数据结构 1. DataFrame的创建 2. DataFrame索引的修改 3. DataFrame数据信息查看 三.文件的读取和写入 1. 读取 2. 写入 四. 数据的 ...
- python学习日记(文件操作)
文件操作概述 计算机系统分为:操作系统,计算机硬件,应用程序. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序 ...
- Python中的pandas模块学习
本文是基于Windows系统环境,学习和测试pandas模块: Windows 10 PyCharm 2018.3.5 for Windows (exe) python 3.6.8 Windows x ...
- python qcut_Python之Pandas库学习(三):数据处理
1. 合并 可以将其理解为SQL中的JOIN操作,使用一个或多个键把多行数据结合在一起. 1.1. 简单合并 参数on表示合并依据的列,参数how表示用什么方式操作(默认是内连接). >> ...
- 【python】使用pandas操作MySQL数据库
使用PyMySQL包获取的数据为元组或者字典格式,如果要做进一步的处理,还需要转换成pandas的DataFrame格式,比较麻烦. 而直接用pandas的read_sql_query()函数可以直接 ...
- [摄影学习]-ZFC进阶操作学习
由于复古外观,通常把右边的转成1/3 STEP档位 机械右波轮 X档 平时不用 快门档 同步速度1/200秒 B档 即常说的b门 需要长时间按下去然后松开 T档 遥控快门 按下去以后,完成曝光,再按下 ...
- 学习日记·C语言学习-函数
目录 一函数的基础知识 二传值和传地址 三传地址 四函数的传出传入参数 五命令行参数(主函数参数) 六使用注意事项 七函数指针 八函数指针数组及指针复杂声明 九复杂指针的声明 十可变参数 1.函数基础 ...
最新文章
- laravel基础课程---8、laravel响应和视图(响应是什么)
- 注解开发不方便_注解(上)
- delphi xe firedac mysql_xe6+firedac 连接sybase
- android 取色器_音乐剪辑器手机版下载-音乐剪辑器app下载v9.10.15 安卓免费版
- Jexus~docker与它产生了暖味
- linux c语言编写聊天室mysql_Linux平台上用C语言实现与MySQL数据库的连接
- c语言通讯录管理系统_通讯录管理系统(C语言)
- C语言丨线性查找(顺序查找)
- IBatis.Net学习笔记三--两种常用的DAO
- Android JNI的调用过程
- hp DV4 声卡驱动 IDT声卡补丁1.1
- Zabbix5系列-监控惠普服务器iLO管理口 (六)
- MATLAB图例设置为透明
- android apk 微信登入_图文详解Android集成微信登录的步骤
- Mac系统运行“exe”文件最简单的解决办法
- 图集 | 航拍玉林29所学校,里面有你的母校吗?
- python十进制转八进制_Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)...
- 实车路试注意事项(路试类)
- sqlserver ssis
- GameBoy系列(一):基本参数
热门文章
- 前端案例二:新浪首页标题栏制作
- 2012年职称计算机,职称计算机考试2012年word2003真题试题
- 2022中低端电动车横向对比(2022.11.13)
- vs_installer.exe打不开 闪退的解决方法
- python语言不采用严格的缩进来表示程序的格式框架_关于 Python 程序格式框架的描述,以下选项中错误的是?????????????????????...
- 【Unity3D 打斗游戏开发】之二 异步加载场景或预加载资源后进入游戏
- require.content
- Java毕业设计_ 基于SSM的JSP教学网站的设计与实现
- 网贷系统架构——前端框架的选择
- 富士(FUJI)贴片机型号有哪些