pandas的拼接操作
使用pd.merge()合并
merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并,使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。
注意:每一列元素的顺序不要求一致
1、一对一合并
# 导入库,别名
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 定义生成DataFrame的函数
def make_df(cols,index):
data = {col:[str(col)+str(ind) for ind in index] for col in cols}
df = DataFrame(data = data,columns = cols ,index = index )
return df
df1 = make_df(['a','b','c'],[1,2,3])
# 输出
a b c
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
df2 = make_df(['a','b','c'],[4,5,6])
# 输出
a b c
4 a4 b4 c4
5 a5 b5 c5
6 a6 b6 c6
pd.merge(df1,df2) #默认是内连接,表的两数据都不对应
# 输出
a b c
pd.merge(df1,df2,how='right')
# 输出
a b c
0 a4 b4 c4
1 a5 b5 c5
2 a6 b6 c6
df5 = make_df(['c','d','e'],[3,4,5])
# 输出
c d e
3 c3 d3 e3
4 c4 d4 e4
5 c5 d5 e5
pd.merge(df1,df5)
# 输出
a b c d e
0 a3 b3 c3 d3 e3
pd.merge(df1,df5,how='left')
# 输出
a b c d e
0 a1 b1 c1 NaN NaN
1 a2 b2 c2 NaN NaN
2 a3 b3 c3 d3 e3
pd.merge(df1,df5,how='right')
# 输出
a b c d e
0 a3 b3 c3 d3 e3
1 NaN NaN c4 d4 e4
2 NaN NaN c5 d5 e5
2、多对一|一对多合并
df1 = make_df(['a','b','c'],[1,2,3])
# 输出
a b c
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
df8 = make_df(['c','d','e'],[1,1,1,4])
# 输出
c d e
1 c1 d1 e1
1 c1 d1 e1
1 c1 d1 e1
4 c4 d4 e4
pd.merge(df1,df8)
# 输出
a b c d e
0 a1 b1 c1 d1 e1
1 a1 b1 c1 d1 e1
2 a1 b1 c1 d1 e1
pd.merge(df1,df8,how='left')
# 输出
a b c d e
0 a1 b1 c1 d1 e1
1 a1 b1 c1 d1 e1
2 a1 b1 c1 d1 e1
3 a2 b2 c2 NaN NaN
4 a3 b3 c3 NaN NaN
pd.merge(df1,df8,how='right')
# 输出
a b c d e
0 a1 b1 c1 d1 e1
1 a1 b1 c1 d1 e1
2 a1 b1 c1 d1 e1
3 NaN NaN c4 d4 e4
pd.merge(df1,df8,how='outer')
# 输出
a b c d e
0 a1 b1 c1 d1 e1
1 a1 b1 c1 d1 e1
2 a1 b1 c1 d1 e1
3 a2 b2 c2 NaN NaN
4 a3 b3 c3 NaN NaN
5 NaN NaN c4 d4 e4
3、 多对多合并
df8 = make_df(['c','d','e'],[1,1,1,4])
# 输出
c d e
1 c1 d1 e1
1 c1 d1 e1
1 c1 d1 e1
4 c4 d4 e4
df8.iloc[0]['d'] = 'qwe'
# 输出
c d e
1 c1 qwe e1
1 c1 d1 e1
1 c1 d1 e1
4 c4 d4 asd
df8['e'][4] = 'asd'
# 输出
c d e
1 c1 qwe e1
1 c1 d1 e1
1 c1 d1 e1
4 c4 d4 asd
df9 = make_df(list('abc'),[1,1,4])
# 输出
a b c
1 a1 b1 c1
1 a1 b1 c1
4 a4 b4 c4
pd.merge(df9,df8,how='outer')
# 输出
a b c d e
0 a1 b1 c1 qwe e1
1 a1 b1 c1 d1 e1
2 a1 b1 c1 d1 e1
3 a1 b1 c1 qwe e1
4 a1 b1 c1 d1 e1
5 a1 b1 c1 d1 e1
6 a4 b4 c4 d4 asd
4、key的规范化
使用on=显式指定某列为key,当有多个key相同时使用
df1 = make_df(['a','b','c'],[1,2,3])
# 输出
a b c
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
df10 = make_df(list('cde'),[1,2,3])
df10.columns = list('wde')
# 输出
w d e
1 c1 d1 e1
2 c2 d2 e2
3 c3 d3 e3
#on的作用是将两个表中相同数据类型,含义一致的字段进行连接的
pd.merge(df1,df10,left_on='c',right_on='w')
# 输出
a b c w d e
0 a1 b1 c1 c1 d1 e1
1 a2 b2 c2 c2 d2 e2
2 a3 b3 c3 c3 d3 e3
df11 = make_df(list('bcd'),[1,2,3])
# 输出
b c d
1 b1 c1 d1
2 b2 c2 d2
3 b3 c3 d3
pd.merge(df1,df11,on='b')
# 输出
a b c_x c_y d
0 a1 b1 c1 c1 d1
1 a2 b2 c2 c2 d2
2 a3 b3 c3 c3 d3
pd.merge(df1,df11,on='c')
a b_x c b_y d
0 a1 b1 c1 b1 d1
1 a2 b2 c2 b2 d2
2 a3 b3 c3 b3 d3
5、列冲突的解决
当列冲突时,即有多个列名称相同时,需要使用on=来指定某个列作为key,配合suffixes指定冲突列名,可以使用suffixes=自己指定后缀。
df1 = make_df(['a','b','c'],[1,2,3])
# 输出
a b c
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
df11 = make_df(list('bcd'),[1,2,3])
# 输出
b c d
1 b1 c1 d1
2 b2 c2 d2
3 b3 c3 d3
pd.merge(df1,df11,on='c',suffixes=('_up','_down'))
# 输出
a b_up c b_down d
0 a1 b1 c1 b1 d1
1 a2 b2 c2 b2 d2
2 a3 b3 c3 b3 d3