Pandas简明教程:九、表的合并、连接、拼接(数据聚合基础)

真实场景中常会遇到多种信息放在不同的表里的情况,此时我们就需要将这些表格的信息整合到一起。这种操作可以极大地减轻我们手动粘数据的工作,从而达到事半功倍的效果。

由于本篇要举的例子较多,因此直接采用官网数据进行说明。

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进行合并。而这里我们看到df1df2并没有共同的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的查询方法则更加容易,由于官方已经给出了十分清楚的说明,这里就不再赘述,有兴趣的同学可以自行查看:

Comparison with SQL

本系列教程教程完整目录:

一、Pandas简介与安装

二、Pandas基本数据结构-DataFrame与Series

三、Pandas文件读写

四、Pandas数据索引方式

五、Pandas简单统计操作及通用方式

六、Pandas条件查询

七、Pandas缺失数据的处理(数据清洗基础)

八、Pandas数据透视表

九、表的合并、连接、拼接(数据聚合基础)

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Pandas中有三种常见的数据拼接方式: 1. concatenate(连接):沿着一个轴将多个数据堆叠在一起。 2. merge(合并):根据一个或多个键将不同的数据连接在一起。 3. join(联接):根据索引将不同的数据连接在一起。 下面是各种拼接方式的示例: 1. concatenate ```python import pandas as pd # 创建两个数据 df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}) df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'], 'B': ['B4', 'B5', 'B6', 'B7'], 'C': ['C4', 'C5', 'C6', 'C7'], 'D': ['D4', 'D5', 'D6', 'D7']}) # 沿着行方向将两个数据连接起来 result = pd.concat([df1, df2]) print(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 0 A4 B4 C4 D4 1 A5 B5 C5 D5 2 A6 B6 C6 D6 3 A7 B7 C7 D7 ``` 2. merge ```python import pandas as pd # 创建两个数据 df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']}) df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}) # 根据 key 列将两个数据连接起来 result = pd.merge(df1, df2, on='key') print(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 ``` 3. join ```python import pandas as pd # 创建两个数据 df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']}, index=['K0', 'K1', 'K2', 'K3']) df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}, index=['K0', 'K1', 'K2', 'K3']) # 根据索引将两个数据连接起来 result = df1.join(df2) print(result) ``` 输出结果: ``` A B C D K0 A0 B0 C0 D0 K1 A1 B1 C1 D1 K2 A2 B2 C2 D2 K3 A3 B3 C3 D3 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半个冯博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值