【Python】Pandas合并表格之(append, join , concat方法)
一,Pandas按照列上下合并表格
强调一下,代码是基于jupyter来写的。很多是用了分段显示。如果是.py格式的话请不要分段显示,另外打印用print()的方式。其他都没什么区别。
数据源:
class1_datas.xlsx
班级 姓名 语文 数学 英语 总分 性别 考号
1 魏薇 73 59 54 186 女 2018010
1 朱瑞麒 59 60 34 153 女 2018012
1 黄慧婕 73 81 84 238 女 2018027
1 张章 60 55 48 163 男 2018094
1 沈政宇 51 71 27 149 男 2018108
1 宋承泽 68 74 53 195 男 2018113
1 马彦冰 77 72 52 201 女 2018148
1 马恺 61 83 72 216 男 2018166
1 王锦程 80 96 83 259 男 2018167
1 闫瑾 74 64 64 202 女 2018196
1 王晓渝 45 12 28 85 女 2018198
1 王浩然 79 86 69 234 女 2018246
1 徐菁 54 90 60 204 女 2018256
1 唐诗涵 83 87 83 253 女 2018266
1 诸葛祥云 57 51 54 162 男 2018273
1 薛智元 62.5 22 46 130.5 男 2018278
1 廉政宇 73 74 55 202 男 2018279
1 马翔 77.5 78 72 227.5 男 2018281
1 王安琪 67 56 67 190 女 2018320
1 邵钰铭 73 91 56 220 男 2018341
1 朱昊宇 65 54 27 146 男 2018343
1 郭逸翔 68 78 62 208 女 2018379
1 马振郡 74 58 49 181 男 2018402
1 彭俊亿 67 83 48 198 男 2018408
1 曹露馨 78 95 82 255 女 2018443
1 郑顺文 70 75 73 218 男 2018456
1 许文泽 85 90 69 244 男 2018465
1 李鹏宇 49 54 47 150 男 2018516
1 韩宗祥 54 49 40 143 男 2018530
1 郁慧 68 50 36 154 女 2018562
1 麻洪轩 80 87 73 240 男 2018580
1 李镇宇 71 79 87 237 男 2018597
1 赵泓博 81 54 29 164 男 2018599
1 孙艺菲 64 59 39 162 女 2018610
1 刘家豪 85 91 95 271 男 2018655
1 王一涵 82 62 79 223 女 2018663
1 林紫凡 49 61 44 154 女 2018665
1 吴琳琳 67 40 37 144 女 2018666
1 李佳琳 74 84 75 233 女 2018680
1 王真 32.5 20 27 79.5 男 2018705
1 高侨 53.5 73 53 179.5 男 2018706
1 田峻赫 59 74 53 186 男 2018716
1 张忠庆 20 4 15 39 男 2018724
1 周星彤 52 48 34 134 女 2018727
1 王菲 80 74 76 230 女 2018742
class2_datas.xlsx
班级 姓名 语文 数学 英语 总分 性别 考号
2 密文芯 65 62 48 175 女 2018019
2 韦婷 72 73 40 185 女 2018020
2 赵奥杰 79 58 52 189 男 2018055
2 李欣欣 77.5 88 72 237.5 女 2018067
2 马凤娇 82 89 89 260 女 2018083
2 张志航 71 86 67 224 男 2018110
2 王颢轩 37 50 33 120 男 2018116
2 吴磊 56 33 42 131 男 2018118
2 张艺琳 57 77 67 201 女 2018123
2 李铭羽 34 25 23 82 女 2018130
2 卢晓慧 64 74 70 208 女 2018133
2 吴文琦 75 97 82 254 男 2018161
2 马宪荣 66 74 57 197 男 2018165
2 李敏琪 85 33 29 147 女 2018186
2 卞舒宁 82 69 88 239 女 2018189
2 李嘉晨 54 63 46 163 男 2018211
2 聂晨 61 56 59 176 女 2018265
2 吕可乐 78 70 81 229 男 2018280
2 张俊博 56 71 39 166 男 2018283
2 高诗茹 52.5 47 64 163.5 女 2018313
2 杨慧 68.5 95 68 231.5 女 2018317
2 张雨欣 62 64 42 168 女 2018325
2 张家溢 60 59 55 174 男 2018335
2 张智杰 79 91 80 250 男 2018337
2 田枫玉 53 20 17 90 男 2018347
2 张家赫 62 83 69 214 男 2018349
2 孙鹏 58 58 37 153 男 2018397
2 刘明松 51 86 43 180 男 2018416
2 谢欣桐 76 71 65 212 女 2018436
2 王雅文 60 77 57 194 女 2018438
2 赵研 96 95 80 271 女 2018440
2 上官豫凯 77 88 56 221 男 2018469
2 穆存晟 54 40 21 115 男 2018511
2 魏晓颖 80 60 61 201 女 2018543
2 郭美辰 82 74 64 220 女 2018545
2 魏佳怡 74 53 57 184 女 2018548
2 苏子渊 74 89 85 248 男 2018588
2 姚杰 80 72 41 193 男 2018592
2 彭嘉豪 29 29 33 91 男 2018593
2 周怡彤 73 73 57 203 女 2018623
2 姜冠羽 72 88 79 239 男 2018656
2 李高玉 43 41 32 116 女 2018677
2 李明泽 69 72 77 218 男 2018697
2 王宁 65 36 36 137 男 2018712
2 曹书魁 47 21 22 90 男 2018730
2 王卓 81 73 81 235 男 2018739
class3_datas.xlsx
班级 姓名 语文 数学 英语 总分 性别 考号
3 陈鑫雨 87 88 85 260 女 2018002
3 朱莹莹 79 81 66 226 女 2018006
3 李芮瑶 69 28 42 139 女 2018018
3 陈佳慧 57 47 37 141 女 2018026
3 王任 62 68 44 174 男 2018037
3 李泉霖 90.5 97 97 284.5 女 2018072
3 韩涵 79.5 64 67 210.5 女 2018074
3 王晶 76 89 69 234 女 2018076
3 庞永琪 69 48 77 194 男 2018117
3 张艺馨 63 63 77 203 女 2018126
3 尤馨悦 74 71 30 175 女 2018143
3 李珂迪 69 61 61 191 女 2018146
3 王茂丞 36 68 23 127 男 2018168
3 蒋洁妤 50 18 24 92 女 2018182
3 张清祥 75 92 84 251 男 2018215
3 郭高旭 76 63 61 200 男 2018216
3 孙紫轩 78 90 72 240 男 2018234
3 王云升 40 85 51 176 男 2018282
3 王慧 55.5 48 36 139.5 女 2018315
3 杨杰 63 92 83 238 男 2018339
3 鲍明祺 57 63 66 186 男 2018350
3 朱梓豪 54 87 70 211 男 2018351
3 付艺阁 64 66 20 150 男 2018354
3 刘译泽 70 84 67 221 女 2018366
3 高政 59 57 41 157 女 2018370
3 王裕超 75 64 78 217 男 2018401
3 王睿 78 80 69 227 男 2018403
3 王一博 65.5 56 76 197.5 女 2018447
3 张恒 50 64 49 163 男 2018467
3 邵珠轩 75 90 77 242 男 2018539
3 周姝含 60 65 64 189 女 2018544
3 张静茹 82 78 58 218 女 2018557
3 阚耀 71 93 51 215 男 2018571
3 纪天圆 60 45 36 141 男 2018578
3 王中源 39 20 11 70 男 2018582
3 郑信瑜 69 65 47 181 男 2018589
3 晁子斌 64 45 21 130 男 2018596
3 苏一苹 71 94 70 235 女 2018614
3 韩林熹 65 38 38 141 男 2018645
3 李旭 34 17 10 61 男 2018653
3 陈休宇 86 68 79 233 男 2018658
3 姬莉 60 67 36 163 女 2018671
3 夏子晟 71 38 41 150 女 2018683
3 石子盈 86 74 87 247 女 2018741
3 王聪 59 75 69 203 男 2018743
class4_datas.xlsx
班级 姓名 语文 数学 英语 总分 性别 考号
4 王靖雅 64 57 56 177 女 2018014
4 顾子晨 34 35 13 82 男 2018031
4 胡博宇 69 80 63 212 男 2018047
4 商雪宁 76 93 78 247 女 2018069
4 李梓瞳 85.5 86 82 253.5 女 2018077
4 李兆鸿 76 75 49 200 男 2018120
4 周诗棋 78 94 67 239 女 2018138
4 张利恒 58 74 64 196 男 2018172
4 刘若惜 55 44 45 144 女 2018192
4 苏永远 73 50 52 175 女 2018200
4 李坤璐 87 77 71 235 女 2018203
4 孙喆 34 59 9 102 男 2018224
4 高义杰 66 73 74 213 男 2018228
4 孙浩然 52 42 26 120 女 2018254
4 刘晨桐 74 87 65 226 男 2018275
4 徐人杰 67.5 83 84 234.5 男 2018285
4 曹一丹 76.5 78 67 221.5 女 2018326
4 丁文博 85 93 88 266 男 2018338
4 刘志浩 61 63 78 202 男 2018348
4 崔凯 63 22 31 116 女 2018374
4 孙瑜 46 60 42 148 女 2018376
4 葛世宇 62 83 39 184 女 2018377
4 陈宗想 71 42 34 147 男 2018395
4 倪羽轩 82 54 37 173 男 2018396
4 宁洋 61 51 51 163 男 2018419
4 朱一诺 73 70 54 197 女 2018428
4 杨环宇 82.5 83 80 245.5 女 2018433
4 殷鑫 28 45 46 119 男 2018455
4 田翔 55 20 47 122 男 2018478
4 李甲硕 62 48 65 175 男 2018497
4 房庆辉 71 85 90 246 男 2018498
4 张孝臣 56 17 32 105 男 2018501
4 王天任 74 78 76 228 男 2018520
4 付森 60 75 56 191 男 2018540
4 何浩楠 55 35 12 102 男 2018573
4 季佳豪 74 55 56 185 男 2018575
4 王琳 83.5 80 74 237.5 女 2018603
4 薄淑婷 63 77 80 220 女 2018611
4 常琬媛 62 48 34 144 女 2018626
4 杨霖 74 97 90 261 男 2018638
4 赵文馨 44 82 47 173 女 2018678
4 张路 81 94 43 218 女 2018679
4 姜含青 81 70 57 208 女 2018690
4 郑凯登 64 69 70 203 男 2018745
4 张瑜涵 75 72 42 189 男 2018746
class5_datas.xlsx
班级 姓名 语文 数学 英语 总分 性别 考号
5 王英杰 81 89 72 242 女 2018001
5 朱洁 77 88 92 257 女 2018011
5 李美辉 58 16 35 109 女 2018024
5 孙鹏 65 58 56 179 男 2018057
5 李美瑶 78.5 69 82 229.5 女 2018070
5 周子谦 77 74 75 226 男 2018106
5 公子豪 61 90 60 211 男 2018112
5 赵宇鹏 72 88 80 240 男 2018155
5 宋皓翰 57 44 18 119 男 2018175
5 赵天成 64 84 64 212 男 2018237
5 徐金珠 71 48 34 153 女 2018245
5 马玥 26 8 4 38 女 2018258
5 宿晓硕 70 90 61 221 男 2018299
5 卢俊蓉 82.5 97 82 261.5 女 2018304
5 朱雪婷 54 69 33 156 女 2018314
5 祝欣月 73.5 57 51 181.5 女 2018328
5 牛瑞旺 10 24 11 45 男 2018336
5 于文杰 56 89 32 177 男 2018357
5 丁一航 39 11 18 68 女 2018381
5 罗博文 53 64 54 171 男 2018415
5 贺子凡 72 63 59 194 男 2018420
5 张艺馨 68 47 49 164 女 2018430
5 高一文 64 31 61 156 女 2018448
5 于群 77 71 66 214 女 2018450
5 李翔旭 40 35 55 130 男 2018460
5 赵建超 83 98 87 268 男 2018474
5 陈俊澎 63 36 43 142 男 2018479
5 孙卿慧 80 55 55 190 女 2018547
5 邱轶姝 85 83 71 239 女 2018553
5 朱俣洁 70 82 27 179 女 2018567
5 岳子琪 62 80 78 220 女 2018617
5 徐浩哲 77 80 83 240 男 2018633
5 王梓谦 74 92 79 245 男 2018643
5 赵一全 57 60 56 173 男 2018647
5 赵梓彤 76 79 42 197 女 2018674
5 张萌丹 83 73 82 238 女 2018675
5 孙子涵 64 85 60 209 女 2018686
5 王艺心 80 65 59 204 女 2018688
5 孙嘉祥 70 85 20 175 男 2018691
5 刘浩然 47 45 59 151 男 2018703
5 王颢运 69.5 73 58 200.5 男 2018707
5 郁章群 73.5 65 68 206.5 男 2018711
5 郑金原 78.5 68 45 191.5 男 2018714
5 朱鹏宇 73 86 73 232 男 2018715
5 杨帅 58 64 64 186 男 2018736
1. append 方法实现列名相同的多表合并
#%% import pandas as pd #注意事项:append函数会通过列索引作为index来对表格一一做匹配,所以各个表格的列索引名字必须一致 #读取多个表,把数据赋值给多个dataframe变量 df01 = pd.read_excel("./source_file/class1_datas.xlsx") df02 = pd.read_excel("./source_file/class2_datas.xlsx") df03 = pd.read_excel("./source_file/class3_datas.xlsx") df04 = pd.read_excel("./source_file/class4_datas.xlsx") df05 = pd.read_excel("./source_file/class5_datas.xlsx") #%% #通过append函数将数据一一添加到变量append_datas这个dateframe中(dataframe可以通过list列表来传入) append_datas = df01.append([df02,df03,df04,df05]) #%% #合并DataFrame #手动创建新的DataFrame并指定列名 df06 = pd.DataFrame( [[6,'刘鹏',89,98,78,265,'男',2020812], [6,'刘景芮',90,70,80,240,'女',2020813]], columns=["班级","姓名","语文","数学","英语","总分","性别","考号"] ) #将新增的数据添加到append_datas中 append_datas = append_datas.append(df06) append_datas #%% #合并字典 append_datas = append_datas.append({"班级":6,"姓名":"高慧娴","语文":97,"数学":78,"英语":85,"总分":260 ,"性别":"女","考号":2020814},ignore_index=True) append_datas #%% #将append_datas中的数据写入到excel表格中并去掉index索引 append_datas.to_excel("./source_file/append_datas.xlsx", index=False) print("表格合并完成!")
2. concat方法中指定轴axis=0实现表格上下合并
#%% #分别读取各个表格 df01 = pd.read_excel("./result_files/class1_datas.xlsx") df02 = pd.read_excel("./result_files/class2_datas.xlsx") df03 = pd.read_excel("./result_files/class3_datas.xlsx") df04 = pd.read_excel("./result_files/class4_datas.xlsx") df05 = pd.read_excel("./result_files/class5_datas.xlsx") #合并DataFrame #手动创建新的DataFrame并指定列名 df06 = pd.DataFrame( [[6,'刘鹏',89,98,78,265,'男',2020812], [6,'刘景芮',90,70,80,240,'女',2020813]], columns=["班级","姓名","语文","数学","英语","总分","性别","考号"] ) df06 #%% df = pd.concat( [df01,df02,df03,df04,df05,df06],axis=0, ignore_index=True ) df.to_excel("./result_files/output_file2.xlsx",index=False) print("Done!!")
3. append方法升级用法
#%% import pandas as pd import os #一并读取某文件夹下所有的excel文件 def read_files(folder:str)-> pd.DataFrame: df_all = pd.DataFrame() #用于存储所有dataframe信息 for fn in os.listdir(folder): #遍历目录下所有文件 full_fn = os.path.join(folder,fn) #获取所有文件的全路径 df_temp = pd.read_excel(full_fn) #读取所有文件 df_all = df_all.append(df_temp) #将所有读取的数据追加到df_all这个dataframe中 return df_all #%% if __name__ == '__main__': #读取数据源目录 datas = read_files(R"C:\Users\Administrator\PycharmProjects\python_Basic\Pandas_to_Excel\20200814\result_files") #打印数据具体信息 datas.info() #将数据保存到excel中. 这里通过ExcelWriter方法写入. with pd.ExcelWriter("./result_files/output_file.xlsx") as writer: datas.to_excel(writer,index=False) print("Done!!") #%%
一,Pandas按照行索引左右合并表格
数据源 : 2份数据分别为一个表格中的2个sheet
姓名 性别 住址
张飞 男 王者峡谷78号
宫本武藏 男 王者峡谷9号
露娜 女 王者峡谷19号
项羽 男 王者峡谷79号
韩信 男 王者峡谷94号
王昭君 女 王者峡谷75号
刘备 男 王者峡谷54号
阿珂 女 王者峡谷47号
关羽 男 王者峡谷11号
夏侯惇 男 王者峡谷92号
杨玉环 女 王者峡谷76号
成吉思汗 男 王者峡谷80号
安其拉 女 王者峡谷10号
赵云 男 王者峡谷17号
武则天 女 王者峡谷64号
马可波罗 男 王者峡谷78号
姓名 电话 张飞 18273643738 宫本武藏 18734728643 露娜 18883748754 项羽 17693475030 韩信 18832847043 王昭君 18737642104 刘备 17083747453 阿珂 17592934775 关羽 18934664832 夏侯惇 18736735430 杨玉环 18734637923 成吉思汗 18628495937 安其拉 18736459002 赵云 18736465840 武则天 18964730029
1. join 方法实现行名相同的多表合并(左右合并)
#%% import pandas as pd #读取sheet1中的数据 df01 = pd.read_excel("./source_file/student_list.xlsx", index_col="姓名") #把姓名设置成index #读取sheet2中的数据 df02 = pd.read_excel("./source_file/student_list.xlsx", sheet_name=1, index_col="姓名") #同样把姓名设置成index #%% df01 #%% df02 #%% #通过join函数左后合并数据,前提index必须一致 #how=outer代表并集合并,inner差集,left,right代表按照左表,右表合并 join_datas = df01.join(df02,how="outer",sort=True) #%% #输出到Excel表格 with pd.ExcelWriter("./source_file/student_list2.xlsx", ) as writer: join_datas.to_excel(writer) print("数据保存完毕!!")
2. concat方法中指定轴axis=1实现表格左右合并
#%% concat_datas = pd.concat( [df01,df02], axis=1, ignore_index=True, ) #%% concat_datas.columns = ["性别","住址","电话"] #设置列名 concat_datas.fillna(" ",inplace=True) #把NaN值转为空 with pd.ExcelWriter("./source_file/student_list3.xlsx", ) as writer: join_datas.to_excel(writer) print("数据保存完毕!!")
结果:
代码中电话的呈现因为最后一个电话是空值因此显示不是很直观。把数据保存到Excel中显示是可以的。如下
r