Chapter 11多表拼接
1.表的横向连接
在横向根据公共列将两个表连接在一起,pandas中用merge()方法,该方法会自动寻找两表的公共列。连接表的类型有一对一,一对多和多对多。
源数据如下:假设商品编号是公共列
1.一对一:待连接的两个表的公共列是一对一的
ic(pd.merge(df,df_join))
输出如下:
2.多对一:两个表中的公共列不是一对一的,其中一个表的公共列有重复值。
如下图右表公共列有重复值:
ic(pd.merge(df,df_join))
输出如下:
此时保留右表的重复值,并在左表中也增加重复值
3.多对多,即两个表的公共列都有重复值,相等于多个多对一连接
输出如下:
4.用on指明连接键。默认就是公共列作为连接键,公共列也可以为多列,以列表的形式传给on参数
ic(pd.merge(df,df_join,on=['商品编号','商品']))
输出如下:
当两个表中公共列的实际值一样,但列名不同时,用left_on用来指明左表用作连接键的列名,right_on用来指明右表用作连接键的列名
ic(pd.merge(df,df_join,left_on='商品名',right_on='商品名称'))
输出如下:
实际业务中数据较多,公共列寻找困难时用参数how指明具体的连接方式。
1.内连接(inner)。取两个表的公共部分,即交集
# 内连接,交集
ic(pd.merge(df,df_join,on='商品编号',how='inner'))
2.外连接(outer)。取两个表的所有部分,即并集
# 外连接,并集
ic(pd.merge(df,df_join,on='商品编号',how='outer'))
3.左连接(left)。以左表为基础,右表有但左表没有的则不显示
# 左连接,以左表为基础,右表有但左表没有的则不显示。拼接过来的信息就用NaN填充
ic(pd.merge(df,df_join,on='商品编号',how='left'))
4.右连接。以右表为基础,左表有但右表没有的则不显示
# 右连接,以右表为基础,左表有但右表没有的则不显示。拼接过来的信息就用NaN填充
ic(pd.merge(df,df_join,on='商品编号',how='right'))
重复列名,用suffixes参数自定义名称
ic(pd.merge(df,df_join,on='商品编号',how='inner',suffixes=["_L","_R"]))
2.表的纵向连接
与横向拼接相对应,在垂直方向上进行拼接。一般的应用场景就是将分离的若干个结构相同的数据表合并成一个数据表。
pd.concat()方法默认保留原表的索引,可以通过设置参数ignore_index的值,让其等于True,这样就会生成一组新的索引
# 纵向合并
ic(pd.concat([df,df_join],ignore_index=True))
总结:表的横向拼接用merge,实际业务中用how指定内外左右四种连接方式,on指定连接键。纵向拼接用concat(注意:结构相同的数据表才能合并)
Chapter12 结果导出
1.导出为Excel文件。主要参数如下:
- excel_writer:设置导出路径及文件名。需要注意的是,如果同一导出文件已经在本地打开,则不能再次运行导出代码,会报错,需要将本地文件关闭以后再次运行导出代码。类似于在本地修改文件名的操作,如果文件是打开的,即被占用的状态,那么不可以执行修改文件的操作。
- sheet_name:导出为本地文件的sheet名
- index:值为False,导出文件时,不导出索引
- columns:设置要导出的列,导出多列用列表的形式传入
- na_rep:缺失值,用来设置缺失值的填充
- inf_rep:无限值,用来设置无限值的填充
# 导出Excel
df.to_excel(excel_writer=r"C:\Users\aurora\Desktop\df_to_excel.xlsx",sheet_name="导出shop",na_rep=0,inf_rep=0,index=False)
此处将DateFrame数据导出到桌面的名为df_to_excel的Excel文件,sheet名为‘导出shop’,异常值都用0填充。
2.导出CSV文件。主要参数如下:
- path_or_buf:设置文件导出路径。与导出Excel一样,需文件关闭时导出。
- index:值为False,导出文件时,不导出索引
- columns:设置要导出的列,导出多列用列表的形式传入
- sep:设置分隔符
- encoding:设置编码格式,默认为UTF-8
#导出csv
df.to_csv(path_or_buf=r"C:\Users\aurora\Desktop\df_to_csv.csv",sep=',',na_rep=0,encoding='utf-8',index=False)
导出CSV文件的异常值处理与导出Excel文件相同。
3.将多个文件导出到多个sheet。用ExcelWriter()函数。主要参数如下:
- excelpath:设置导出路径
- engine:处理数据的引擎,用xlxswriter处理Excel数据
# 将df1,df2分别导出到dfs_to_excels文件的表1,表2
df1 = pd.DataFrame([[1,2,3],[4,5,6]])
df2 = pd.DataFrame([['a','b','c'],['d','e','f']])
excelpath = r"C:\Users\aurora\Desktop\dfs_to_excels.xlsx"
writer = pd.ExcelWriter(excelpath,engine="xlsxwriter")
df1.to_excel(writer,sheet_name="表1")
df2.to_excel(writer,sheet_name="表2",index=False)
# _save函数写入
writer._save()
总结:导出Excel文件用to_excel,excel_writer参数设置导出路径;导出CSV文件用to_csv,path_or_buf参数设置导出路径,其他参数大致相同。