pandas级联与合并
字段大部分一样用拼接,大部分不一样用合并
1. 拼接与合并定义
1.1 拼接
- 方法
pd.concat
pd.append
pd.concat,pd.append函数类似,只是多了一些参数:
axis=0
keys
join=‘outer’/‘inner’:表示的是级联方式
outer会将所有的项进行级联(忽略匹配不匹配),inner只会将匹配的项级联,不匹配的项不级联
(忽略匹配或不匹配),而Inner只会将匹配的项级联到一起,不匹配的不级联ignore_index=False
1.2 合并
merge
与concat
的区别在于merge
需要依据某一共同列来进行合并
- 使用
pd.merge()
合并时,会自动根据两者相同columns
名称的那一列,作为key
来进行合并 - 注意:每一列元素的顺序不要求一致
2.pd.concat
方法拼接操作
2.1 匹配拼接操作
指的是级联的维度的索引一致
纵向级联时列索引一致,横向级联时行索引一致
-
索引维度一致名字不一致
df1=pd.DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=['A','B','C']) df2=pd.DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=['A','D','C']) #axis=1,横向级联,在行后面添加 pd.concat((df1,df2),axis=1)
-
索引维度和名字一致
df1=pd.DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=['A','B','C']) pd.concat((df1,df1),axis=1)
2.2 不匹配拼接操作
指的是级联的维度的索引不一致
例如:纵向级联时列索引不一致,横向级联时行索引不一致
- 如果想要保留数据的完整性必须使用
outer
(外连接)
2.2.1 外连接
-
外连接
[outer]:补NaN(默认模式)
df1=pd.DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=['A','B','C']) df2=pd.DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=['A','D','C']) #默认外级联,不可以级联的填充为NaN pd.concat((df1,df2),axis=0) # aixs=0,增加行
2.2.2 内连接
- 内连接
[inner]
:只连接匹配的项df1=pd.DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=['A','B','C']) df2=pd.DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=['A','D','C']) #inner直接把可以级联的级联,不可以级联的不处理 pd.concat((df1,df2),axis=0,join='inner')
3. append函数的使用
-
只能追加列 【列名相同,向下追加,行数会增加】
# ignore_index=True列索引重置 df1.append(df2,ignore_index=True)
4. pd.merge()
合并操作
4.1 定义
4.2 一对一合并
- 根据相同的列索引合并
df1=DataFrame({
'employee':['lucy','mercy','tom'],
'group':['Accounting','Engineering','Engineering']
})
df2 = DataFrame({
'employee':['lucy','mercy','tom'],
'hire_data':[2004,2008,2012]
})
pd.merge(df1,df2,on='employee')
4.3一对多合并
on
不写,默认情况下使用两表中共有的列作为合并条件
df3=DataFrame({
'employee':['lisa','jake'],
'group':['Acounting','Engineering'],
'hire_data':[2004,2016]
})
df4=DataFrame({
'group':['Accounting','Engineering','Engineering'],
'supervisor':['Carly','Guido','Steve']
})
pd.merge(df3,df4)
4.4 多对多合并
df1=DataFrame({
'employee':['lucy','mercy','tom'],
'group':['Accounting','Engineering','Engineering']
})
df5=DataFrame({
'group':['Engineering','Engineering','HR'],
'supervisor':['Carly','Guido','Steve']
})
4.4.1 左合并
- 左表为主表
#左表为主表df1 pd.merge(df1,df5,how='left')
4.4.2 右合并
- 右表为主表
#右表为主表,df5 pd.merge(df1,df5,how='right')
4.5 key的规范化
-
当两张表没有可进行连接的列时,可使用
left_on
和right_on
手动指定merge
中左右两边的那一列作为连接的列df1=DataFrame({ 'employee':['Bobs','Linda','Bill'], 'group':['Accounting','Product','Marketing'], 'hire_date':[1998,2017,2018] }) df5=DataFrame({ 'name':['Lisa','Bobs','Bill'], 'hire_dates':[1998,2016,2007] }) #df1的employee与df5的name,对应 pd.merge(df1,df5,left_on='employee',right_on='name')
5. pandas 数据对比
df9.compare(df10,keep_shape=True,keep_equal=True)
#keep_equal=True:再保留原始相同的值
#,keep_shape=True:保留原数据框