1、pandas.merge :根据一个或多个键将不同DataFrame中的行连接起来。
2、pandas.concat: 可以沿着一条轴将多个对象堆叠到一起
3、实例方法conbine_first: 将重复数据编结到一起,用一个对象中的值填充另外一个对象的缺失值。
数据准备:
import pandas as pd
import os
os.chdir('E:\学习文档\data')
os.getcwd()
student_data = pd.read_excel('Test_score.xlsx',sheet_name ='Sheet1')
student_data
score_data = pd.read_excel('Test_score.xlsx',sheet_name ='Sheet2')
score_data
pd.merge各项参数说明
'''
pd.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, validate=None)
常用参数说明
left:参与合并的左侧的DataFrame
right:参与合并的右侧的DataFrame
how : {'left', 'right', 'outer', 'inner'}, 默认 'inner'
left:左外联接,以左侧的DataFrame数据为基准,右侧的DataFrame的数据能关联的关联,不能关联的摒弃
right:右外联接,以右侧的DataFrame数据为基准,左侧的DataFrame的数据能关联的关联,不能关联的摒弃
outer:全连接,取两个DataFrame的并集
inner:内连接,取两个DataFrame的交集
on:用于连接的列名,在左右两个DataFrame同时存在
left_on:左键,左侧DataFrame要进行关联的键
right_on :右键,右侧DataFrame要进行关联的键
left_index:使用左侧DataFrame中的索引作为连接键。
right_index:使用右侧DataFrame中的索引作为连接键。
sort:合并后的数据进行排序,默认为True,处理大数据集时可禁用以获得更好的性能。
suffixes:字符串值元组,用于追加到重叠列名的末尾,
如果左右两个DataFrame都有同一个值Data,合并后将会出现Data_x,Data_y
'''
内连接 inner
# 内连接
pd.merge(student_data,score_data,on='id')
取交集。由于左右两个DataFrame都有同一个值name,所以合并后会加以区分
左外连接 left
# 左连接
pd.merge(student_data,score_data,on='id',how ='left')
右侧的DataFrame没有 id为5、6、7、8的数据,所以name_y、score为空值。
右外连接 right
# 右连接
pd.merge(student_data,score_data,on='id',how ='right')
左侧的DataFrame没有 id为9、10的数据,所以name_x、gender为空值。
全外连接 outer
# 全连接
pd.merge(student_data,score_data,on='id',how ='outer')
此时为内连接,其他连接方式可参照上面几个例子。
# 交集
pd.merge(left=student_data,right=score_data,left_index =True,right_index =True)
# 重置索引
student_data.reset_index(inplace=True)
# 设置索引
student_data.set_index(keys =['id','name'],inplace =True)
student_data
score_data.reset_index(inplace =True)
score_data
pd.merge(student_data,score_data,left_index = True,right_on=['id','name'])
拓展:除了上述方式,还可以使用join进行两个DataFrame之间的连接
DataFrame1
# left.join(right)
# 默认左连接
student_data.join(score_data, lsuffix='_left', rsuffix='_right')
也可成为连接、绑定、堆叠。
pd.concat各项参数说明
'''
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)
numpy 中 concatenation函数
常用参数说明:
objs:参与连接的Pandas对象的列表或字典
axis:连接的轴向,默认0,纵向连接
join:{inner,outer},默认outer,取并集
join_axes:指明其他用于n-1条轴的索引,不执行并集/交集运算
keys:用于形成连接轴上的层次化索引
levels:若设置了的keys,指定用于层次化索引各级别上的索引
names:若设置了levels和keys,用于创建分级别的名称
ignore_index:不保留连接轴上的索引,产生一组新索引
'''
纵向堆叠
取并集
pd.concat([student_data,score_data1])
可以看出数据纵向进行了合并,索引值并不连贯
设置 ignore_index,不保留连接轴上的原索引,产生一组新索引
pd.concat([student_data,score_data1],ignore_index=True)
对于进行合并的两个DataFrame,在合并的方向上产生了两个索引。
当行拼接若有相同的索引时,为区分索引,我们在最外层定义了索引的分组情况。
pd.concat([student_data,score_data1],keys=[['data1','data2']])
横向堆叠
按照索引进行横向堆叠
pd.concat([student_data,score_data1],keys=['data1','data2'],axis=1,join='inner')
可以看出根据行索引4,5横向合并了两个DataFrame的数据。
DataFrame1与DataFrame2有一部分重叠数据,当DataFrame1这部分重叠数据有缺失的时候,用DataFrame2的数据,无缺失,用自己的。
import numpy as np
s1 = pd.Series([np.nan, 2.5, np.nan, 3.5, 4.5, np.nan],index=['f', 'e', 'd', 'c', 'b', 'a'])
s2 = pd.Series(np.arange(len(s1), dtype=np.float64),index=['f', 'e', 'd', 'c', 'b', 'a'])
可以看出s1中f,d,a皆有缺失值,这三个值,可以用s2的来填补
s1.combine_first(s2)