6、Python 数据分析-Pandas级联与合并
1、级联操作concat()函数
- pd.concat, pd.append
pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数:
- objs:series,dataframe或者是panel构成的序列lsit
- axis:需要合并链接的轴,0是行,1是列 ,默认axis=0
- join:'outer' / 'inner':表示的是级联的方式,outer会将所有的项进行级联(忽略匹配和不匹配),而inner只会将匹配的项级联到一起,不匹配的不级联
- ignore_index=False
1.1、匹配级联
df1 = DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=['A','B','C'])
df2 = DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=['A','D','C'])
df1
df2
pd.concat((df1,df1),axis=1)
1.2、不匹配级联
- 不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致
- 有2种连接方式:
- 外连接:补NaN(默认模式)
- 内连接:只连接匹配的项
pd.concat((df1,df2),axis=0)
outer取并集
#如果想要保留数据的完整性必须使用outer(外连接)所有的进行级联(忽略匹配和不匹配)
pd.concat((df1,df2),axis=0,join='outer')
inner取交集
#匹配的级联合并到一起
pd.concat((df1,df2),axis=0,join='inner')
2、合并操作merge()函数
- merge与concat的区别在于,merge需要依据某一共同列来进行合并
- 使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。
- 注意每一列元素的顺序不要求一致
merge的参数
- on:列名,join用来对齐的那一列的名字,用到这个参数的时候一定要保证左表和右表用来对齐的那一列都有相同的列名。
- left_on:左表对齐的列,可以是列名,也可以是和dataframe同样长度的arrays。
- right_on:右表对齐的列,可以是列名,也可以是和dataframe同样长度的arrays。
- left_index/ right_index: 如果是True的haunted以index作为对齐的key
- how:数据融合的方法。
- sort:根据dataframe合并的keys按字典顺序排序,默认是,如果置false可以提高表现。
merge的默认合并方法:merge用于表内部基于 index-on-index 和 index-on-column(s) 的合并,但默认是基于index来合并。
2.1、一对一合并
df1 = DataFrame({'name':['Bob','Jake','Lisa'],
'city':['北京','上海','上海'],
})
df2 = DataFrame({'name':['Lisa','Bob','Jake'],
'age':[16,19,25],
})
pd.merge(left=df1,right=df2,on='name')
2.2、一对多合并
df3 = DataFrame({
'employee':['Lisa','Jake'],
'city':['北京','上海'],
'age':[19,16]})
df4 = DataFrame({'city':['北京','上海','上海'],
'hobby':['Sports','Music','Run']
})
pd.merge(left=df3,right=df4,on='city')
2.3、多对多合并
df1 = DataFrame({'name':['Bob','Jake','Lisa'],
'city':['北京','上海','上海']})
df5 = DataFrame({'city':['上海','上海','深圳'],
'hobby':['Sports','Music','Run']
})
pd.merge(left=df1,right=df5,on='city',how='right')
左合并(保留左表数据):how='left'
右合并(保留右表数据):how='right'
3、key的规范化
- 当列冲突时,即有多个列名称相同时,需要使用on=来指定哪一个列作为key,配合suffixes指定冲突列名
df1 = DataFrame({'name':['Jack',"Summer","Steve"],
'city':['北京','上海','广州']})
df2 = DataFrame({'name':['Jack','Bob',"Jake"],
'age':[15,18,25],
'city':['北京','深圳','江苏']})
pd.merge(df1,df2,on='city')
- 当两张表没有可进行连接的列时,可使用left_on和right_on手动指定merge中左右两边的哪一列列作为连接的列
df1 = DataFrame({'employee':['Bobs','Linda','Bill'],
'city':['北京','上海','广州'],
'age':[14,22,32]})
df5 = DataFrame({'name':['Lisa','Bobs','Bill'],
'age':[14,18,28]})
pd.merge(df1,df5,left_on='employee',right_on='name')