目录
- 工具包准备
- 纵向合并
- 横向合并
- 总结
- 附录代码
工具包准备
纵向合并
数据准备:
初始数据为包含3个工作簿的Excel工作表,3个工作簿的列标签都一致。
这里附上数据表:workbook1.xlsx读取数据:
读取上面三个工作簿的数据以DataFrame格式存储,并查看其中一个:
(前两个sheet各有100行数据,第三个sheet有112行数据,不计首行)
合并数据:
1)pd.concat()方法
得到的数据表结果显示“312 rows × 9 columns”,共312行9列,数据纵向合并成功。
没完,发现数据展示的最后一行的索引值是“111”,这么一看数据好像只有112行?
(其实是一个简单问题,活跃下气氛,大佬们略过就好_(:з」∠)_)
这里是因为数据合并是原数据表的索引没有重置,可以添加参数 “ignore_index=True” 重置索引再合并:
除此之外,还可以使用reset_index()直接对新表进行索引重置,语法如下:
#重置表S的索引
S.reset_index()
当需要合并的表格有多个时,可以构建for循环来简化操作,如下:
这里循环构建的前提是各个sheet名之间有一定的规律性。
2)append()方法
同样在多表合并时也可以利用for循环:
横向合并
数据准备:
两个数据表:t1.csv、t2.csv,都是拆分后的景点信息,可以按 t1 的 dname1 和 t2 的 dname2作为匹配条件进行匹配合并。
DataFrame 横向合并使用的函数是 pd.merge(),合并逻辑类似 SQL 当中的内外连接查询,具体就不展开了,可以参考我的这一篇博客:SQL学习笔记2——内、外连接查询,使用的是同样的数据。
下面开始实操:
合并数据:
1)内连接
这里的参数“ how=‘inner’ ”是可以省略的,默认合并方式就是以内连接形式
对比SQL当中内连接的结果,可以看到是一模一样的:
2)外连接
外连接同理,连接结果与SQL当中的外连接是一样的,下面直接放图对比。
左连接:
右连接:
总结
1) 两个或多个DataFrame之间可以纵向或横向合并,纵向合并增添行,横向合并增添列;
2) 纵向合并通常会利用 xlrd工具包来获取 Excel 工作表的 sheet名,可以使用 pd.concat() 或 append() 方法进行合并;
3) 横向合并类似SQL中的内外连接查询,根据需求对应进行内连接、左连接、右连接等操作。
附录代码
import pandas as pd
import xlrd
import os
os.chdir('D:\practice') #设置当前工作路径
****纵向合并****
workbook = xlrd.open_workbook('workbook1.xlsx') #打开指定Excel工作表
sheetname = workbook.sheet_names() #读取sheet名
sheetname
#获取workbook1中各工作簿的数据
s1 = pd.read_excel('workbook1.xlsx',sheet_name = 'Sheet1')
s2 = pd.read_excel('workbook1.xlsx',sheet_name = 'Sheet2')
s3 = pd.read_excel('workbook1.xlsx',sheet_name = 'Sheet3')
s3 #查看其中一个表的数据
#合并上面的3个表
S = pd.concat([s1,s2,s3],axis=0) #axis=0表示按行操作
S
S = pd.concat([s1,s2,s3],axis=0,ignore_index=True) #重置索引合并
S
#构建for循环
DF = pd.DataFrame()
for i in sheetname:
DF_i = pd.read_excel('workbook1.xlsx',sheet_name = i)
DF = pd.concat([DF,DF_i],axis=0,ignore_index=True)
DF
#append方法合并
S = s1.append([s2,s3],ignore_index=True)
S
#构建for循环
DF = pd.DataFrame()
for i in sheetname:
DF_i = pd.read_excel('workbook1.xlsx',sheet_name = i)
DF = DF.append([DF_i],ignore_index=True)
DF
****横向合并****
t1 = pd.read_csv('t1.csv')
t1
t2 = pd.read_csv('t2.csv')
t2
#内连接
T1 = pd.merge(left=t1,right=t2,how='inner',left_on='dname1',right_on='dname2')
T1
#左外连接
T2 = pd.merge(left=t1,right=t2,how='left',left_on='dname1',right_on='dname2')
T2
#右外连接
T3 = pd.merge(left=t1,right=t2,how='right',left_on='dname1',right_on='dname2')
T3