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操作学习相关推荐

  1. 正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang

    正则表达式学习日记_<学习正则表达式>笔记_Mr_Ouyang 所属分类: 正则表达式学习日记  书名:     学习正则表达式 作者:     Michael Fitzgerald 译者 ...

  2. CUMT学习日记——Verilog课程学习全记录

    CUMT学习日记--Verilog课程学习全记录 系列第一篇 计算机网络复习 系列第二篇 计算机组成原理复习 系列第三篇 微机原理与接口技术复习 系列第四篇 计算机操作系统复习 系列第五篇 数据库原理 ...

  3. Python模块之Pandas模块学习笔记

    目录 一.模块的安装 二.数据结构 1. DataFrame的创建 2. DataFrame索引的修改 3. DataFrame数据信息查看 三.文件的读取和写入 1. 读取 2. 写入 四. 数据的 ...

  4. python学习日记(文件操作)

    文件操作概述 计算机系统分为:操作系统,计算机硬件,应用程序. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序 ...

  5. Python中的pandas模块学习

    本文是基于Windows系统环境,学习和测试pandas模块: Windows 10 PyCharm 2018.3.5 for Windows (exe) python 3.6.8 Windows x ...

  6. python qcut_Python之Pandas库学习(三):数据处理

    1. 合并 可以将其理解为SQL中的JOIN操作,使用一个或多个键把多行数据结合在一起. 1.1. 简单合并 参数on表示合并依据的列,参数how表示用什么方式操作(默认是内连接). >> ...

  7. 【python】使用pandas操作MySQL数据库

    使用PyMySQL包获取的数据为元组或者字典格式,如果要做进一步的处理,还需要转换成pandas的DataFrame格式,比较麻烦. 而直接用pandas的read_sql_query()函数可以直接 ...

  8. [摄影学习]-ZFC进阶操作学习

    由于复古外观,通常把右边的转成1/3 STEP档位 机械右波轮 X档 平时不用 快门档 同步速度1/200秒 B档 即常说的b门 需要长时间按下去然后松开 T档 遥控快门 按下去以后,完成曝光,再按下 ...

  9. 学习日记·C语言学习-函数

    目录 一函数的基础知识 二传值和传地址 三传地址 四函数的传出传入参数 五命令行参数(主函数参数) 六使用注意事项 七函数指针 八函数指针数组及指针复杂声明 九复杂指针的声明 十可变参数 1.函数基础 ...

最新文章

  1. laravel基础课程---8、laravel响应和视图(响应是什么)
  2. 注解开发不方便_注解(上)
  3. delphi xe firedac mysql_xe6+firedac 连接sybase
  4. android 取色器_音乐剪辑器手机版下载-音乐剪辑器app下载v9.10.15 安卓免费版
  5. Jexus~docker与它产生了暖味
  6. linux c语言编写聊天室mysql_Linux平台上用C语言实现与MySQL数据库的连接
  7. c语言通讯录管理系统_通讯录管理系统(C语言)
  8. C语言丨线性查找(顺序查找)
  9. IBatis.Net学习笔记三--两种常用的DAO
  10. Android JNI的调用过程
  11. hp DV4 声卡驱动 IDT声卡补丁1.1
  12. Zabbix5系列-监控惠普服务器iLO管理口 (六)
  13. MATLAB图例设置为透明
  14. android apk 微信登入_图文详解Android集成微信登录的步骤
  15. Mac系统运行“exe”文件最简单的解决办法
  16. 图集 | 航拍玉林29所学校,里面有你的母校吗?
  17. python十进制转八进制_Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)...
  18. 实车路试注意事项(路试类)
  19. sqlserver ssis
  20. GameBoy系列(一):基本参数

热门文章

  1. 前端案例二:新浪首页标题栏制作
  2. 2012年职称计算机,职称计算机考试2012年word2003真题试题
  3. 2022中低端电动车横向对比(2022.11.13)
  4. vs_installer.exe打不开 闪退的解决方法
  5. python语言不采用严格的缩进来表示程序的格式框架_关于 Python 程序格式框架的描述,以下选项中错误的是?????????????????????...
  6. 【Unity3D 打斗游戏开发】之二 异步加载场景或预加载资源后进入游戏
  7. require.content
  8. Java毕业设计_ 基于SSM的JSP教学网站的设计与实现
  9. 网贷系统架构——前端框架的选择
  10. 富士(FUJI)贴片机型号有哪些