文渊网,仅供学习,如有侵权请联系删除。整理零零碎碎的数据1.问题:现在有两个studentform,如何把它们合并成一个form?这只能通过使用merge函数在Python中实现。importpandasaspdimportmatplotlib.pyplotasplt#读取Excel工作簿中两个表的数据,数据如上图students=pd.read_excel('students.xlsx',sheet_name='student')scores=pd.read_excel('students.xlsx',sheet_name='score')#合并表格table=students.merge(scores,on='ID')print(table)************************************************************ID姓名等级01student_00184.013student_00359.025student_00567.037student_00779.049student_00950.0511student_01190.0613student_01378.0715student_01576.0817student_017100.0919student_019NaN1021student_02188.01123student_023NaN1225student_02575.0***********************************************************#merge也可以使用这样,效果是一样的table=pd.merge(students,scores,how='left',on='ID')2、合并函数merge(self,right,how="inner",on=None,left_on=无,right_on=无,left_index=False,right_index=False,sort=False,suffixes=("_x","_y"),copy=True,indicator=False,validate=None,)left:参与合并的左边DataFrameright:参与合并的右边DataFramehow:connectionmethod:'inner'(default);also,'outer','left','right'on:用于连接的列的名称,它必须存在于左右DataFrame对象中。如果指定了位,则将左右列名的交集作为joinkeyleft_on:在左侧DataFarm中作为joinkey的列right_on:在右侧DataFarm中作为joinkey的列left_index:使用左边的行索引作为它的连接键right_index:使用右边的行索引作为它的连接键sort:根据连接键对合并后的数据进行排序,默认为True有时禁用此选项可以在处理时获得更好的性能largedatasets左右DataFrame对象都有'data',则结果中会出现'data_x','data_y'。copy:设置为False,可以避免在某些特殊情况下将数据复制到结果数据结构中。始终分配默认值。可以参考上面的说明进行优化。我们合并后发现数据中有NaN,也就是缺失数据。我们通常是怎么处理的呢?可以使用fillna函数处理table=students.merge(scores,how='left',on='ID').fillna(0)以上处理的结果是用0填充缺失值。fillna还有很多其他的方法,你可以试试DataFrame.fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,**kwargs)参数:value:variable,Dictionary、Series或DataFrame来填充缺失值(例如0),或者指定每个索引(对于Series)或列(对于DataFrame)使用哪个Dictionary/Serise/DataFrame的值。(不在字典/Series/DataFrame中的值将不会被填充)值不能是列表。方法:{'backfill','bfill','pad','ffill',None},默认为None;使用方法填充系列中的间隙('backfill'、'bfill'向前填充、'pad'、'ffill'向后填充)轴:{0或'index'、1或'columns'}inplace:布尔值,默认值错误的。如果为真,请填写到位。注意:这将修改辅助对象上的任何其他视图(例如,DataFrame中没有列的复制粘贴)限制:int,默认为None;如果指定了方法,则这是连续NaN值的向前/向后要填充的最大量。也就是说,如果连续的NaN个数超过这个数,就只会被部分填充。如果未指定方法,则这是将填充NaN的整个轴上的最大数量。如果不是None,必须大于0。downcast:dict,默认为None;如果可能,item->dtype的dict将尝试向下转换为适当的相等类型的字符串(例如,如果可能,float64到int64)join(),contact()函数也可以实现,这类似于函数和merge的用法,不再单独介绍。数据校验数据校验是我们拿到数据后首先要做的工作。根据数据的特点,编写相应规则的验证函数。下面演示最简单的一个。#查看数据是否有异常分数defscore_validation(row):ifnot0<=row['grade']<=100:print(f"#%s\tstudent%shasaninvalidscore%s"%(row.ID,row['name'],row['score']))#在main函数中调用。axis=1axis为1表示数据从左到右(行验证),0表示从上到下(列验证)students.apply(score_validation,axis=1)**************************************************************************************************#1学生student_001的分数无效184#7学生student_007成绩无效-79#15学生student_015成绩无效176#19学生student_019成绩无效-15#23学生student_023成绩无效111发现5条错误数据,可更正或处理与以后。将一列数据拆分为多列数据1、问题:现在我有一个电话本,想把电话一栏的区号和电话号码分成两列,怎么办?2.思路是读取数据列,使用split函数拆分,然后保存文件importpandasaspd#Readfiledatas=pd.read_excel('Tel.xlsx')#拆分Tel列,保存df中的data,expand参数不能省略df=datas['Tel'].str.split('-',expand=True)datas['areacode']=df[0]datas['telephone']=df[1]datas.to_excel('Tel.xlsx')打印(数据)**********************************************nameTel区号电话0zhang1010-871249101087124911zhang2029-875211202987521122zhang309170-87121130917087121133zhang4010-471211401047121144zhang5010-371211501037121155wang01020-871211602087121166wang02010-871211701087121177wang03021-851211802185121188wang04010-801211901080121199wang050910-871212009108712120Functionusage:split(sep,n,expand=false)sepindicatesthecharacterusedforsplitting;n表示表格分为多少列;expand表示是否扩展到Data部分,True输出Series,False输出Dataframe。学习Python的路上肯定会遇到困难,不要慌张,我这里有一套学习资料,包括40+电子书,800+教学视频,涉及Python基础、爬虫、框架、数据分析、机学习等等,别怕你学不会!https://shimo.im/docs/JWCghr8...《Python学习资料》关注公众号【蟒圈】,每日优质文章推送。
