真实场景中常会遇到多种信息放在不同的表里的情况,此时我们就需要将这些表格的信息整合到一起。这种操作可以极大地减轻我们手动粘数据的工作,从而达到事半功倍的效果。
由于本篇要举的例子较多,因此直接采用官网数据进行说明。
1、简单合并方法
首先给定三个表:
df1
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
df2
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
df3
A B C D
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
表中的表头为A,B,C,D
四列,每列中包含的数据不相同,此时对其直接进行合并。
frames = [df1, df2, df3]
result = pd.concat(frames)
result
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
可以看到,这种操作十分方便。
这个看似简单的操作在许多时候能够起到大作用。比如我们统计一些学生的高考成绩(刚好4列),这些学生的高考成绩按照学校、班级存在许多个不同的文件中。那么此时我们可以结合
os
的方法将所有表格依次读出再合并为一个表。想象一下比如有100张表格,那么我们只需要简单几句代码就能全部合并起来。而手动操作的话光是打开、复制、粘贴就至少得1-2个小时才能完成,如果每张表头的摆放顺序不一样还会花费更多的时间。
合并函数的定义是这样的:
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None,
levels=None, names=None, verify_integrity=False, copy=True)
其中objs
即是要被合并的对象(可以是许多类型),详细的说明可以直接查看官网,这里我们只挑最重要的问题进行讲解。
2、选择拼接方向
axis
默认是0,可以理解为按行拼接。下面我们试试设为1:
result = pd.concat([df1, df2], axis=1, sort=False)
result
A B C D A B C D
0 A0 B0 C0 D0 NaN NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN NaN
2 A2 B2 C2 D2 NaN NaN NaN NaN
3 A3 B3 C3 D3 NaN NaN NaN NaN
4 NaN NaN NaN NaN A4 B4 C4 D4
5 NaN NaN NaN NaN A5 B5 C5 D5
6 NaN NaN NaN NaN A6 B6 C6 D6
7 NaN NaN NaN NaN A7 B7 C7 D7
可以看到,此时是将两张表合并到了一起,并具有名称相同的列,但它们各自对应的index
还是原来的。
3、选择拼接方式
直接对上面的两张表做这样一个操作:
result = pd.concat([df1, df2], axis=1, join='inner',sort=False)
Empty DataFrame
Columns: [A, B, C, D, A, B, C, D]
Index: []
这里要注意一个问题:当我们按照inner
方式进行合并的时候,它是选择两个表共有的index
或者column
进行合并。而这里我们看到df1
和df2
并没有共同的index
,而此时又是按照横向拼接的,因此结果为空。
为了方便叙述我们再造一张表,演示一下从不同方向的inner
合并结果:
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
result = pd.concat([df1, df4], axis=1, join='inner',sort=False)
result
A B C D B D F
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
result = pd.concat([df1, df4], axis=0, join='inner',sort=False)
result
B D
0 B0 D0
1 B1 D1
2 B2 D2
3 B3 D3
2 B2 D2
3 B3 D3
6 B6 D6
7 B7 D7
而其它的如重新分配key
值、用append
方法给表格添加数据等方法就相对容易理解了。有需要的同学直接查看文档即可。
4、按照统一的key
值合并
在实际应用场景中我们常会遇到这样的情况:假设我手上有客户的一些信息的表,但客户的各类信息分散在不同的几个表中,比如下面这种情况。
left
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
3 K3 A3 B3
right
key C D
0 K0 C0 D0
1 K1 C1 D1
2 K2 C2 D2
3 K3 C3 D3
这里key
列可以看作是客户的编号,而A,B,C,D
分别是客户的各类信息。那么此时我们想要将这两张表合并起来,就可以用下面的方法:
result = pd.merge(left, right, on='key')
result
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
注意这个例子比较特殊,因为两张表都有完全相同的key
值,而真实场景中常常不能满足这一条件,那么此时我们就要指定某张表作为主表。
这里我们先把右表的最后一行删掉:
right = right.drop([3])
key C D
0 K0 C0 D0
1 K1 C1 D1
2 K2 C2 D2
再指定左表为主表:
result = pd.merge(left, right, how='left', on='key')
result
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 NaN NaN
此时左表的所有key
值就被保留了下来。
同理,如果以右表为主表,则只有右表的key
值:
result = pd.merge(left, right, how='right', on='key')
result
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
注意:此时还有一种场景也是经常遇到的,就是每张表的key
值都不完整,那么此时就用outer
方法进行合并:
left = left.drop([0]) # 删掉左表第一行,那么此时两张表的key值就都不完整了
result = pd.merge(left, right, how='outer', on='key')
result
key A B C D
0 K1 A1 B1 C1 D1
1 K2 A2 B2 C2 D2
2 K3 A3 B3 NaN NaN
3 K0 NaN NaN C0 D0
相反,如果是用inner
则取交集:
result = pd.merge(left, right, how='inner', on='key')
result
key A B C D
0 K1 A1 B1 C1 D1
1 K2 A2 B2 C2 D2
5、对比SQL
如果对SQL比较熟悉,那么学会Pandas的查询方法则更加容易,由于官方已经给出了十分清楚的说明,这里就不再赘述,有兴趣的同学可以自行查看: