内容:
·基础概念
·一对一合并
·多对一合并
·多对多合并
·当字段存在多个相同项时
·当字段不存在匹配项时
·删除列/行drop()
·how参数
【基础概念】
在内容上存在对应关系
(1)找到相同的key字段
(2)进行该列元素的匹配
(3)合并
函数:merge()只能用于两个表的左右拼接
在进行操作之前,需要导入五个表格:
table_1 = pd.read_excel("C:/Users/YHT/Desktop/表1.xlsx", sheet_name="1", header=0, index_col=0)
table_2 = pd.read_excel("C:/Users/YHT/Desktop/表1.xlsx", sheet_name="2", header=0, index_col=0)
table_3 = pd.read_excel("C:/Users/YHT/Desktop/表1.xlsx", sheet_name="3", header=0, index_col=0)
table_4 = pd.read_excel("C:/Users/YHT/Desktop/表1.xlsx", sheet_name="4", header=0, index_col=0)
table_5 = pd.read_excel("C:/Users/YHT/Desktop/表1.xlsx", sheet_name="5", header=0, index_col=0)
print(table_1)
print()
print(table_2)
print()
print(table_3)
print()
print(table_4)
print()
print(table_5)
print()
运行结果:
【一对多合并】
如果需要拼接的两个表中,有相同的列信息,那么进行拼接的时候即使不指定以哪个字段作为主键,函数也会默认用信息相同的列做主键对两个表进行拼接,同时会将该列未匹配的元素行删除,如下例:
"""一对一合并"""
# 如果需要拼接的两个表中,有相同的列信息,那么进行拼接的时候即使不指定以哪个字段作为主键,函数也会默认用信息相同的列做主键对两个表进行拼接,同时会将该列未匹配的元素行删除,如下例:
print("table_1和table_2级联:\n", pd.concat(objs=(table_1, table_2), axis=0))
print("table_1和table_2合并:\n", pd.merge(table_1, table_2))
print()
运行结果:
【一对多合并】
"""多对一合并"""
print("table_1和table_3合并:\n", pd.merge(table_1, table_3))
print()
运行结果:
【多对多合并】
默认:
(1)把字段相同的列作为合并的依据;
(2)默认如果有多个列的标签相同,则会同时参考多列合并;
"""多对多合并"""
# 默认(1)把字段相同的列作为合并的依据,(2)默认如果有多个列的标签相同,则会同时参考多列合并
print("table_3和table_4合并:\n", pd.merge(table_3, table_4))
print()
运行结果:
【当字段存在多个相同项】
使用on=显式指定那一列为key,当有多个key相同时使用;
根据suffixes的传入参数,可以给表格中相同的key添加后缀;
"""key的规范化"""
# 使用on=显式指定那一列为key,当有多个key相同时使用
# 根据suffixes的传入参数,可以给表格中相同的key添加后缀
print("table_3和table_4合并:\n", pd.merge(table_3, table_4, on="手机型号"))
print("table_3和table_4合并:\n", pd.merge(table_3, table_4, on="手机型号", suffixes=("_上半年", "_下半年")))
print()
运行结果:
【当字段不存在匹配项】
left_on:左表被指定的key
right_on:右表被指定的key
"""当key(列字段)不相等时合并"""
# left_on:左表被指定的key
# right_on:右表被指定的key
things_1 = pd.merge(table_1, table_5, left_on="手机型号", right_on="型号")
print("table_1和table_5合并:\n", things_1)
运行结果:
【删除列/行drop】
labels=,传入参数为列表,列表元素为被删除的行/列标签
默认删除行,axis=0
"""删除列/列drop"""
# ;labels=,传入参数为列表,列表元素为被删除的行/列标签
# 默认删除行,axis=0
things_2 = things_1.drop(labels=["型号"], axis=1)
print(things_2)
print()
运行结果:
【how参数】
在合并时,how默认参数为inner,也就是内合并;
merge(合并):只保留相同的【内容】;
concat(级联):只保留相同的【标签】;
保留交集:how="inner";
保留并集:how="outer";
左表为主表:how="left";
右表为主表:how="right";
"""how参数"""
# 在合并时,how默认参数为inner,也就是内合并
# merge(合并):只保留相同的【内容】
# concat(级联):只保留相同的【标签】
# 保留交集:how="inner"
# 保留并集:how="outer"
# 左表为主表:how="left"
# 右表为主表:how="right"
print("table_1和table_2合并(保留交集):\n", pd.merge(table_1, table_2, how="inner"))
print("table_1和table_2合并(保留并集):\n", pd.merge(table_1, table_2, how="outer"))
print("table_1和table_2合并(左表为主表):\n", pd.merge(table_1, table_2, how="left"))
print("table_1和table_2合并(右表为主表):\n", pd.merge(table_1, table_2, how="right"))
print()
运行结果: