Python学习日记-pandas操作学习

    科技2022-09-01  110

    Python学习日记-pandas模块学习

    根据需求筛选数据绘制柱状图-利用pandas绘制绘制柱状图-利用matplotlib绘制绘制柱状图-两组数据比较绘制柱状图-叠加柱状图绘制饼状图绘制折线图绘制散点图绘制直方图绘制密度图和打印相关性联立两张sheet进行数据验证进行数据拆分按行/列求和/均值删除表中重复的数据表格转置读取csv/tsv/txt文件成dataframe数据透视表根据原始数据拟合曲线数据行的增、删、改、插入数据列的增、删、改、插入、并联、串联对列数据进行复杂的计算

    根据需求筛选数据

    # 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)/2 return 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)
    Processed: 0.008, SQL: 10