合并数据
当有多张表时,比如菜品订单详情表,菜品信息表,菜品分类表时,我们需要对其进行合并。
堆叠进行数据合并
堆叠就是简单的把两个表拼到一起,也被称作轴向连接、绑定连接,数据堆叠分为横向堆叠和纵向堆叠
横向堆叠
将两个表的x轴拼接到一起,可以使用concat函数完成,先看下concat的源码
def concat(
objs: Iterable[NDFrame] | Mapping[Hashable, NDFrame],
axis: Axis = 0,
join: str = "outer",
ignore_index: bool = False,
keys=None,
levels=None,
names=None,
verify_integrity: bool = False,
sort: bool = False,
copy: bool = True,
) -> DataFrame | Series:
objs | 接受多个Series,DataFrame的组合,表示参与连接的pandas对象的列表组合 |
---|---|
axis | 接受0或1,默认为0 |
join | 接受inner或者outer。表示其他轴上的索引是按交集还是并集合并,默认并集 |
join_axes | 接受Index对象,表示用于其他n-1轴的索引,不执行交集并集运算 |
ignore_index | 接受布尔类型。表示是否保留连接轴上的索引,产生一组新索引,默认为否 |
keys | 接受squence |
levels | 接受多个squence的list |
names | 接受list |
当axis=1时,conat做行对齐,将不同列名称的两张或者多张表合并,当内连接时仅仅返回索引重叠部分,在外连接情况下则显示索引的并集部分数据,不足的地方用NaN来填补。 |
import pandas as pd
left = pd.DataFrame({'A': ['A0', 'A1'],
'B': ['B0', 'B1']},
index=['a', 'b'])
right = pd.DataFrame({'A': ['C0', 'C1'],
'D': ['D0', 'D1']},
index=['c', 'd'])
print(left)
print(right)
print(pd.concat([left, right], join='outer', axis=1))
如果是inner,则只有行索引一样的才会合并
纵向堆叠
纵向堆叠是让两个数据表在y轴上进行拼接,concat函数和append函数都能实现,在默认情况下,concat函数中的axis的参数为0的情况下,可以将不同行索引的表直接纵向合并
如图,两张表并没有相同的列索引,所以使用inner的方式连接无法合并
当我修改列名之后即可,若设置为outner模式
主键合并数据
pandas.merge(left, right,
how='inner', on=None,
left_on=None,right_on=None,left_index=False,
right_index=False, sort=False,
suffixes=('_x', '_y'),copy=True,
indicator=False)
主键合并数据就是根据某个几个字段一一对应拼接起来,结果数据集的列数为两个原数据的列数减去连接键的数量
import pandas as pd
# 创建第一个数据集:学生的成绩信息
grades = pd.DataFrame({'ID': [1, 2, 3, 4, 5],
'Grade': ['A', 'B', 'C', 'B', 'A']})
# 创建第二个数据集:学生的个人信息
info = pd.DataFrame({'ID': [1, 2, 3, 4, 5],
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [18, 19, 20, 19, 18]})
# 使用主键合并两个数据集
merged_data = pd.merge(grades, info, on='ID')
# 打印合并后的数据集
print(merged_data)
如图
重叠合并
两份数据几乎一样的表,如果有一张数据缺失比较多,可以使用重叠合并
重叠合并的语法pandas.DataFrame.combine_first(other)
import pandas as pd
grades = pd.DataFrame({'ID': [1, 2, 3, 4, 5],
'Grade': ['A', None, 'C', 'B', 'A']})
info = pd.DataFrame({'ID': [1, 2, 3, 4, 5],
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [18, 19, 20, 19, 18],
'Grade':['A','a',None,'b','a']
})
merged_data =grades.combine_first(info)
# 打印合并后的数据集
print(merged_data)