06.Pandas表合并和主键合并
表合,主键合并
1.表合并
def 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)
参数含义:
-
objs
:Series,DataFrame或Panel对象的序列或映射。如果传递了dict,则排序的键将用作键参数,除非它被传递,在这种情况下,将选择值(见下文)。任何无对象将被静默删除,除非它们都是无,在这种情况下将引发一个ValueError。 -
axis
:{0,1,...},默认为0。沿着连接的轴。 -
join
:{'inner','outer'},默认为“outer”。如何处理其他轴上的索引。outer为联合和inner为交集。 -
ignore_index
:boolean,default False。如果为True,请不要使用并置轴上的索引值。结果轴将被标记为0,...,n-1。如果要连接其中并置轴没有有意义的索引信息的对象,这将非常有用。注意,其他轴上的索引值在连接中仍然受到尊重。 -
join_axes
:Index对象列表。用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑。 -
keys
:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。 -
levels
:序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。 -
names
:list,default无。结果层次索引中的级别的名称。 -
verify_integrity
:boolean,default False。检查新连接的轴是否包含重复项。这相对于实际的数据串联可能是非常昂贵的。 -
copy
:boolean,default True。如果为False,请勿不必要地复制数据。图解内外连接:
横向堆叠外连接:
横向堆叠内连接:
构建数据
columns = ['姓名', '年龄', '班级', ]
data = [['码云', np.nan, 1014], ['李佳乘', 16, 1015],
['李恺符', 20, 1015, ], ['马画藤', 18, 1014]]
df1 = pd.DataFrame(columns=columns, data=data)
columns2 = ['成绩', '年龄', '性别']
data2 = [[88, 1, 1], [82, 2, 1], [90, 2, 1], [99, 3, 0]]
df2 = pd.DataFrame(columns=columns2, data=data2)
print('df1:\n', df1)
print('------------------')
print('df2:\n', df2)
print('------------------')
1.横向堆叠,内连接
join='inner' 内连接
横向堆叠只看,行索引,行索引一样就可以堆叠
print(pd.concat([df1, df2], axis=1, join='inner'))
#
df1:
姓名 年龄 班级
0 码云 NaN 1014
1 李佳乘 16.0 1015
2 李恺符 20.0 1015
3 马画藤 18.0 1014
------------------
df2:
成绩 年龄 性别
0 88 1 1
1 82 2 1
2 90 2 1
3 99 3 0
------------------
姓名 年龄 班级 成绩 年龄 性别
0 码云 NaN 1014 88 1 1
1 李佳乘 16.0 1015 82 2 1
2 李恺符 20.0 1015 90 2 1
3 马画藤 18.0 1014 99 3 0
2.横向堆叠,外连接
默认 join='outer'
print(pd.concat([df1,df2],axis=1))
姓名 年龄 班级 成绩 年龄 性别
0 码云 NaN 1014 88 1 1
1 李佳乘 16.0 1015 82 2 1
2 李恺符 20.0 1015 90 2 1
3 马画藤 18.0 1014 99 3 0
3.纵向堆叠,内连接
print(pd.concat([df1, df2], axis=0, join='inner'))
# 两个表共有的进行
df1:
姓名 年龄 班级
0 码云 NaN 1014
1 李佳乘 16.0 1015
2 李恺符 20.0 1015
3 马画藤 18.0 1014
------------------
df2:
成绩 年龄 性别
0 88 1 1
1 82 2 1
2 90 2 1
3 99 3 0
------------------
年龄
0 NaN
1 16.0
2 20.0
3 18.0
0 1.0
1 2.0
2 2.0
3 3.0
2.主键合并
用途:
pandas中的merge()函数类似于SQL中join的用法,可以将不同数据集依照某些字段(属性)进行合并操作,得到一个新的数据集。
源码:
def 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,right | 要合并的左侧,和右侧 |
how | 默认为inner,可设为inner/outer/left/right |
on | 根据某个字段进行连接,必须存在于两个DateFrame中(若未同时存在,则需要分别使用left_on和right_on来设置) |
left_on | 左连接,以DataFrame1中用作连接键的列 |
right_on | 右连接,以DataFrame2中用作连接键的列 |
left_index | 将DataFrame1行索引用作连接键 |
right_index | 将DataFrame2行索引用作连接键 |
sort | 根据连接键对合并后的数据进行排列,默认为True |
suffixes | 对两个数据集中出现的重复列,新数据集中加上后缀_x,_y进行区别 |
构建数据
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K3'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
print('left:\n', left)
print('--------------------')
print('right:\n', right)
print('--------------------')
#
left:
key1 key2 A B
0 K0 K0 A0 B0
1 K0 K1 A1 B1
2 K1 K0 A2 B2
3 K2 K1 A3 B3
--------------------
right:
key1 key2 C D
0 K0 K0 C0 D0
1 K1 K0 C1 D1
2 K1 K0 C2 D2
3 K3 K0 C3 D3
--------------------
1.内连接:只保留公共的主键
print(pd.merge(left, right, on='key1'))
#
key1 key2_x A B key2_y C D
0 K0 K0 A0 B0 K0 C0 D0
1 K0 K1 A1 B1 K0 C0 D0
2 K1 K0 A2 B2 K0 C1 D1
3 K1 K0 A2 B2 K0 C2 D2
2.外连接:保留所有的数据
print(pd.merge(left, right, on='key1', how='outer'))
#
key1 key2_x A B key2_y C D
0 K0 K0 A0 B0 K0 C0 D0
1 K0 K1 A1 B1 K0 C0 D0
2 K1 K0 A2 B2 K0 C1 D1
3 K1 K0 A2 B2 K0 C2 D2
4 K2 K1 A3 B3 NaN NaN NaN
5 K3 NaN NaN NaN K0 C3 D3
3.左连接:以坐标中的键为主
print(pd.merge(left, right, on='key1', how='left'))
key1 key2_x A B key2_y C D
0 K0 K0 A0 B0 K0 C0 D0
1 K0 K1 A1 B1 K0 C0 D0
2 K1 K0 A2 B2 K0 C1 D1
3 K1 K0 A2 B2 K0 C2 D2
4 K2 K1 A3 B3 NaN NaN NaN
4.右连接:以右表中的键为主
print(pd.merge(left, right, on='key1', how='right'))
key1 key2_x A B key2_y C D
0 K0 K0 A0 B0 K0 C0 D0
1 K0 K1 A1 B1 K0 C0 D0
2 K1 K0 A2 B2 K0 C1 D1
3 K1 K0 A2 B2 K0 C2 D2
4 K3 NaN NaN NaN K0 C3 D3
5.多个主键
print(pd.merge(left, right, on=['key1','key2'], how='outer'))
#
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K0 K1 A1 B1 NaN NaN
2 K1 K0 A2 B2 C1 D1
3 K1 K0 A2 B2 C2 D2
4 K2 K1 A3 B3 NaN NaN
5 K3 K0 NaN NaN C3 D3
6.名称不一致时,不要声明主键
print(pd.merge(left, right,left_on='key1', right_on='key2', how='outer'))
key1_x key2_x A B key1_y key2_y C D
0 K0 K0 A0 B0 K0 K0 C0 D0
1 K0 K0 A0 B0 K1 K0 C1 D1
2 K0 K0 A0 B0 K1 K0 C2 D2
3 K0 K0 A0 B0 K3 K0 C3 D3
4 K0 K1 A1 B1 K0 K0 C0 D0
5 K0 K1 A1 B1 K1 K0 C1 D1
6 K0 K1 A1 B1 K1 K0 C2 D2
7 K0 K1 A1 B1 K3 K0 C3 D3
8 K1 K0 A2 B2 NaN NaN NaN NaN
9 K2 K1 A3 B3 NaN NaN NaN NaN
7.重叠合并
dict1 = {'ID':[1,2,3,4,5,6,7,8,9],
'System':['W10','w10',np.nan,'w10',np.nan,np.nan,'w7','w7','w8']}
dict2 = {'ID':[1,2,3,4,5,6,7,8,9],
'System':[np.nan,np.nan,'w7','w7','w7','w7','w8',np.nan,np.nan]}
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
print(df1)
print(df2)
print(df2.combine_first(df1))