Python数据分析与可视化教案3.7 数据的拼接和合并.docx
课 题3.7数据的拼接和合并课 型讲练授课班级大数据授课时数2教学目标1 .理解纵向拼接和横向合并的意义。2 .能够将多个数据进行纵向拼接。3 .能够将多个数据进行横向合并。4 .理解横向合并中内连接、外连接、左连接、右连接的作用。教学重点1 .能够将多个数据进行纵向拼接。2 .能够将多个数据进行横向合并。教学难点1.理解横向合并中内连接、外连接、左连接、右连接的作用。学情分析数据的连接在数据库SQL中已经学过,这一点有助于pandas的数据合 并的内容的学习。在数据导入时,往往会遇到数据的合成。比方某店铺想了解某月的销售额,就需 要将这个月第1天、第2天、,直到最后一天的日销售报表合成一个月销售报表, 以了解商铺的运营情况。数据的合成是一种将来自不同源的数据组合成一个报表的有 效方法常用的方法。如果将两个或多个列名完全相同的DataFrame数据连接起来,从方向上看是数据 的纵向拼接。如果根据某一列将不同的两个DataFrame数据合并在一起,从方向上看 是数据的横向合并。纵向拼接和横向合并都有各自的特点,使用时需要注意数据合成 的方向。一、数据的纵向拼接数据的纵向拼接将两个或多个DataFrame同列拼接,在拼接时,要保证不同的 DataFrame列名必须全部相同,否那么就会出现多个空值。纵向拼接可以使用append 函数,叩pend的一般用法为:DataFrame.append(other, ignore_index)其中,other表示添加的数据。ignore_index表示是否忽略原来索引并重新构建索引。append函数可以将数据向 下拓展,在数据拼接时,如果仅仅将默认的索引按照原始的行号连接起来,比方表1 默认索引是0、1、2、,表2默认索引是0、1、2、,连接后的索引就是0、1、 2、0、1、2、,这显然不方便数据的调用。ignore_index=True表示忽略原来索 引重新构建索引,即表2的索引会在表1的索引的基础自动向下编号,使得两个表的 索引变为一个完整的索引,便于数据选取。ignorejndex=False表示沿用原来索引, 而且这是默认设置。例如代码如下:import numpy as npimport pandas as pdarrl = np.arange( 1,10).reshape(3,3)data_l = pd.DataFrame(arrl,columns='aVb,'c,)arr2 = np.arange( 10,16).reshape(2,3)data_2 = pd.DataFrame(arr2,columns='a'/b7e,|)print( " 初始数据为:n ” ,data_ 1)print("初始拼接数据为据”,data_2)data_appendl = data_ 1 .append(data_2,ignore_index=False)data_append2 = data_ 1 .append(data_2,ignore_index=True)print("沿用原来索引的结果为:ndata_叩pend 1)print("重新构建索引的结果为果”,data_append2)3-7C:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/3-7.py 初始数据为:a b c0 12 314 5 62 7 8 9初始拼接数据为:a b c0 10 11 121 13 14 15沿用原来索引的结果为:a b c01231456278901101112I11131415重新构建索引的结果为:a b c0123568911 1214 15Process finished with exit code 0图3-*数据的纵向拼接例如结果【结果分析】从结果中可以看到,在数据拼接时,如果参数ignore_index等于 False, data_2的索引还是原来的0和1,如果参数ignore-ndex等于True, data_2 的索引就在data索引的基础上自动变为新索引3和4。二、数据的横向合并merge函数可以将两个表格(DataFrame)进行横向合并,通过merge函数可以将 两个Dataframe根据一些共有的列(合并字段或主键)合并起来,比方编号“ID”。 横向合并时可以选择不同的合并方式,可以选择inner(默认)、outer> left> right这几 种模式,分别对应是内连接、外连接,左连接,右连接。merge函数的一般用法为:pandas.merge(left_Dataframe,right_Dataframe,how,on,sort)其中,各个参数的作用如下:left_Dataframe表示参与合并的左侧DataFrameoright_Dataframe表示参与合并的右侧DataFrameohow 表示合并方式,取值包括'inner'、'outer'、'left'、Tight',默认为'inner'。'inner' 表示内连接,即两个表将根据合并字段(主键)的重复取值进行合并,类似于交集。 6ute,表示外连接,即两个表将根据合并字段(主键)的所有取值进行合并,类似于 并集。卜任表示左连接,即两个表将根据左表合并字段(主键)的取值进行合并。Tight, 表示右连接,即两个表将根据右表合并字段(主键)的取值进行合并。如果在数据合 并时,除了用于合并的主键以外,还出现了其他重复的列,最后的结果中,会以“列 名_x”和“列名_y”的方式出现。on表示用于连接的列名,未指定那么使用两列的交集作为连接键。sort表示合并以后数据排序,True表示升序,False表示降序。例如代码如下:arrl = np.arange( 1,10).reshape(3,3)data_left = pd.DataFrame(arrl,columns=|'a,/bVc,) datajeft,key, = ,001,002,;003,arr2 = np.arange( 10,19).reshape(3,3)data_right = pd.DataFrame(arr2,columns= '/dVe* ) data.rightfkey'=001700270041 print("初始左表数据为:n”,dataeft) print("初始右表数据为:n ” ,data_right)data_merge 1 = pd.merge(data_left,data_right,how='inner',on='key,) print("按内连接方式的合并结果为:n ” ,data_merge 1)data_merge2 = pd.merge(data_left,data_right,how=,outer',on='key') print("按外连接方式的合并结果为:n”,data_merge2) 输出结果如图3-*所示。Run:3-7C:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/3-7.py 初始左表数据为:a b c keyFp0123001初始右表数据为:adekey010111200111314150022161718004内连接的合并结果为:Process finished with exit code 0a_x b c keyaqde01 2 3 00110111214 5 6 002171415外连接的合并结果为:ax b ckeya_/de0 1.0 2.0 3.030110.G11.0 12.01 4.0 5.0 6.030213.(14.0 15.02 7.0 8.0 9.0303NahNaN NaN3 NaN NaN NaN 004皿17.0 18.0图3-*内连接和外连接例如结果【结果分析】从结果可以看到,采用内连接的连接方式时,根据两表“key”列 中相同的2条数据(001和002)进行了合并。采用外连接的连接方式时,根据两表 “key”列中所有4条数据(001、002、003和004)进行了合并。例如代码如下:data_merge3 = pd.merge(dataeft,data_right,how='left',on='key')print("按左连接方式的合并结果为:n ” ,data_merge3)data_merge4 = pd.mergeCdata-lefdata-right,how=Yightoney*)print("按右连接方式的合并结果为:n ” ,data_merge4)Run:3-71 0 示 丑1 0 示 丑abc ke;012300114560022789003初始右表数据为:C:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/3-7.py 初始左表数据为:0a10d11e12ke: 00111314150022161718004左连接的合并结果为:a_xbckeya_/de012300110.11.012.0145600213.C14.015.02789003NahNaNNaN右连接的合并结果为:a_xbckeya_d01.02.03.000110111214.05.06.00021314152NaNNaNNaN004161718Processfinishedwithexitcode0图3-*左连接和右连接例如结果【结果分析】从结果可以看到,采用左连接的连接方式时,根据左表“key”列 中3条数据(001、002和003)进行了合并。采用右连接的连接方式时,根据右表“key” 列中3条数据(001、002和004)进行了合并。任务实训任务1 :利用循环语句,依次导入supermarket.xlsx(supermarket.xlsx存放在c:data 路径中)中前4张工作表“1月1日”、“1月2日”、“1月3日”、“1月4日”,数据 如图3-*所示。利用叩pend函数依次拼接,拼接时,忽略原来数据的索引,结果存放 在 datal_appendosupermarketjclix - Microsoft Excelsupermarketjclix - Microsoft Excel页面布闰公式数据审阅视图X情传金的 130E F G H IAB订单ID,客户ID010101' 14485-11 A,a'三三.物_ > A-津津字体G I对齐方式G常规阴T故字.舄条件格式,,1日用表格格式 哼用元格样式样式a*删除 a 团格式,a:钳为.排序和标选直找和选择单元格刷相23456010102,10165010104'10165010105'17170010106'15730订单日期单价较愤2018-04-27 00:00:006522018-06-15 00:00:006322018-06-15 00:00:00162018-12-09 00:00:008042017-05-31 00:00:004593姓惠安安良:I 一. 户曾许许宋万126323201377I100% -因 I口 100%日a-未体“ FY三一版j楝黑黑r器T £打热叫-4.3. . 域它用表格格式,删除”图,"仁,B Z u- > A受.至参叁律演 知:。.;厚单式。府格式2即W崎选查丽评M .06.剪贴板G字体二对齐方式G 数字 G 样式 单元格稿相明明明 俞俞前至 H 0 C * I ?supermarketjdsx - Microsoft Excel X文件.开始 ISA 页面布H 公式supermarketjclix - Microsoft Excel页面布局公式数据审阅视图Go3S3常规阴T_ > A- *5 津澧4 字体心 | 对齐灰 心收字.显条件格式上施入,1日用表格格式产的除,巧用元格样式圆格式样式单元格|:"筋&排序和荷选直找和选择supermarketjclsx - Microsoft Excel X粘贴文件 11B Z U 字体对齐万式放字”空布H £、. 我曳南民P| M A R|嗝相落贴板样式第元格舄条件格式超2用表格格式 均单元格样式,supermdtketjdsx - Microsoft Excel-K页面布同公式数58审阅视图A柒,秘. 11 A* A三三三涉,剪贴板B Z U _ > 字体Z货对齐方式吗 ,展展喀单元格样式数字 Q 样式M: 3: M 热,£格式.q.博序和筛选杳谢诩翠- XoO 3蒸 舄条杵格式, 每套用表格格式,图3-*任务1初始数据具体代码如下:pd.seCoptionCdisplay.maX-ColumnsNone)pdset_option('display. width',None)pd.set_option(,True)datal = pd.read_excel(,c:datasupermarket.xlsx,sheet_name=O)for i in range(l,4):datal_append = pd.read_excel(,c:datasupermarket.xlsx',sheet_name=i) datal = data 1 .append(data 1 _append,ignore_index=True)print("拼接后 1 月数据 datal 为:n",datal)输出结果如图3-*所示。Run:3-7AC:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/3-7.py拼接后1月数据datal为:订单ID客户ID客户姓名订单日期单价数量销售金额01010114485曾惠2018-04-2765213011010210165许安2018-06-1563212621010410165许安2018-06-151623231010517170宋良2018-12-0980432041010615730万兰2017-05-314593137751020118325俞明2016-10-27123791113361020318325俞明2016-10-27240248071020418325俞明2016-10-2721654866081030210885赵婵2016-06-05228368491030310885赵婵2016-06-0526551325101040114050白鹄2018-10-0233372331111040214050白鹄2018-10-0286186Process finished with exit code 0图3-*任务1输出结果任务2:任务1的数据拼接结果datal是1月的局部销售记录,而supermarket.xlsx 中第5张工作表“1月打折”记录1月局部订单的打折数据,下面datal将作为左表 数据,将工作表“1月打折”作为右表数据,将“订单ID”作为合并的连接键,按照 内连接的方式将两表进行连接,合并结果存放在data2,并输出data2的前5行中,折 扣金额大于5000的“客户姓名”、“销售金额”、“打折金额”。具体代码如下:data_left = dataldata_right = pd.read_excel(,c:datasupermarket.xlsx',sheet_name=,l 月打折”)data2 = pd.merge(dataeft,data_right,how='inner',on=W ID')print("数据合并结果为:n ” ,data2)result = data2.head(5).locdata2折扣金额>50001客户姓名?销售金额?折扣金额print("数据合并后的数据筛选输出结果为:n”,result) 输出结果如图3-*所示。Run:3-7数据合并结果为:0订单ID 10101客户ID客户姓名订单日期单价数量销售金额折扣130折扣金额14485曾惠2018-04-276520.478.011010210165许安2018-06-156321260.0126.021010410165许安2018-06-15162320.4192.031010517170宋良2018-12-098043200.01377.041020118325俞明2016-10-2712379111330.011133.051020418325俞明2016-10-272165486600.08660.061030210885赵婵2016-06-0522836840.0684.071030310885赵婵2016-06-05265513250.01325.0数据合并后的数据筛选输出结果为: 客户姓名销售金额折扣金额4 俞明 1113311133.0Process finished with exit code 0图3-*任务2输出结果巩固训练利用循环语句,依次导入score.xlsx中前5张工作表“1班”、“2班”、“3班”、“4 班”、“5班”,并利用append函数依次拼接,连接时,忽略原来数据的索引,查询合 并数据行数。