W
e
l
c
o
m
e
: )

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))
posted @ 2020-03-11 23:12  水一RAR  阅读(915)  评论(0编辑  收藏  举报