Pandas连接两个表的完全指南

发布时间:2023-05-22

在数据分析中,我们经常需要从多个表中提取数据并进行分析。Pandas是一个广泛使用的Python库,用于数据处理和数据分析。Pandas提供了许多功能,其中之一是连接两个表。连接两个表可以让我们从两个相关的表中提取数据。在本篇文章中,我们将详细介绍如何使用Pandas连接两个表。

一、连接两个表的基本概念

在Pandas中,我们可以使用merge()函数来连接两个表。连接表的基本思想是将两个表中共有的列合并成一个,这个共有的列被称为连接键(key)。每个表都有自己的连接键,这些键将被用于匹配对应的行。连接两个表的结果是一个新的表,这个新的表中包含了原来两个表中的所有行。 在连接两个表时,需要注意以下几点:

  1. 连接键可以由多个列组成,这取决于具体的情况。
  2. 连接时可以选择不同的方式,包括内连接、左连接、右连接和外连接等。
  3. 在连接两个表时,要确保两个表中的连接键具有相同的数据类型和值范围。

二、内连接

内连接是最常用的数据连接方式。在内连接中,只有在连接键相同的情况下,才会将两个表中的行合并为一行。 下面是一个简单的例子。有两个表,一个是orders表,一个是customer表。orders表中存储了订单信息,customer表中存储了客户信息。这两个表都有一个关键字customer_id,可以通过这个关键字将两个表连接起来。

import pandas as pd
orders = pd.DataFrame({'order_id': [1, 2, 3, 4, 5],
                       'customer_id': ['101', '102', '101', '103', '104'],
                       'order_date': ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05']})
customers = pd.DataFrame({'customer_id': ['101', '102', '103', '104'],
                          'customer_name': ['Alice', 'Bob', 'Charlie', 'Dave']})
merged_data = pd.merge(orders, customers, on='customer_id')
print(merged_data)

输出结果如下:

   order_id customer_id  order_date customer_name
0         1         101  2020-01-01         Alice
1         3         101  2020-01-03         Alice
2         2         102  2020-01-02           Bob
3         4         103  2020-01-04       Charlie
4         5         104  2020-01-05          Dave

三、左连接

在左连接中,左表的所有行都会被保留,而右表中没有匹配的行将被填充为缺失值。 下面我们来看一个例子。还是以orders表和customer表为例。我们要按照客户的姓名来对订单进行分组,并计算每个客户的订单数。在这个例子中,我们需要使用left join来连接这两个表,这样即使不存在一个客户没有下过任何订单也能保留客户信息。

import pandas as pd
orders = pd.DataFrame({'order_id': [1, 2, 3, 4, 5],
                              'customer_id': ['101', '102', '101', '103', '104'],
                              'order_date': ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05']})
customers = pd.DataFrame({'customer_id': ['101', '102', '103', '104'],
                                     'customer_name': ['Alice', 'Bob', 'Charlie', 'Dave']})
merged_data = pd.merge(orders, customers, on='customer_id', how='left')
result = merged_data.groupby('customer_name')['order_id'].count()
print(result)

输出结果如下:

customer_name
Alice      2
Bob        1
Charlie    1
Dave       1
Name: order_id, dtype: int64

四、右连接

在右连接中,右表也就是指定表的所有行都会被保留,而左表中没有匹配的行将被填充为缺失值。 下面我们来看一个例子。还是以orders表和customer表为例。我们要按照客户的姓名来对订单进行分组,并计算每个客户的订单数。在这个例子中,我们需要使用right join来连接这两个表,这样即使一个客户信息没有在orders表中出现也能保留该客户信息。

import pandas as pd
orders = pd.DataFrame({'order_id': [1, 2, 3, 4, 5],
                              'customer_id': ['101', '102', '101', '103', '104'],
                              'order_date': ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05']})
customers = pd.DataFrame({'customer_id': ['101', '102', '103', '104'],
                                     'customer_name': ['Alice', 'Bob', 'Charlie', 'Dave']})
merged_data = pd.merge(orders, customers, on='customer_id', how='right')
result = merged_data.groupby('customer_name')['order_id'].count()
print(result)

输出结果如下:

customer_name
Alice      2.0
Bob        1.0
Charlie    1.0
Dave       1.0
Name: order_id, dtype: float64

五、外连接

在外连接中,两个表中所有的行都会被保留。如果某个表中没有匹配的行,则用缺失值填充。 下面我们来看一个例子。还是以orders表和customer表为例。我们要按照客户的姓名来对订单进行分组,并计算每个客户的订单数。在这个例子中,我们需要使用outer join来连接这两个表,这样即使某个客户没有下过任何订单也能保留该客户信息。

import pandas as pd
orders = pd.DataFrame({'order_id': [1, 2, 3, 4, 5],
                              'customer_id': ['101', '102', '101', '103', '104'],
                              'order_date': ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05']})
customers = pd.DataFrame({'customer_id': ['101', '102', '103', '104', '105'],
                                     'customer_name': ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve']})
merged_data = pd.merge(orders, customers, on='customer_id', how='outer')
result = merged_data.groupby('customer_name')['order_id'].count()
print(result)

输出结果如下:

customer_name
Alice      2.0
Bob        1.0
Charlie    1.0
Dave       1.0
Eve        0.0
Name: order_id, dtype: float64

六、多列连接

在某些情况下,连接两个表时需要使用多个连接键。例如,我们可能需要连接两个表的日期和时间列。在这种情况下,我们可以使用merge()函数的on参数来指定连接键。 下面我们来看一个例子。有两个表,一个是orders表,一个是returns表。orders表中存储了订单信息,returns表中存储了退货信息。这两个表都有两个关键字customer_idorder_date,可以通过这两个关键字将两个表连接起来。

import pandas as pd
orders = pd.DataFrame({'order_id': [1, 2, 3, 4, 5],
                               'customer_id': ['101', '102', '101', '103', '104'],
                               'order_date': ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05'],
                               'order_value': [100, 200, 300, 400, 500]})
returns = pd.DataFrame({'return_id': [1, 2, 3, 4],
                                     'customer_id': ['101', '103', '101', '104'],
                                     'return_date': ['2020-01-02', '2020-01-03', '2020-01-05', '2020-01-04'],
                                     'return_reason': ['Defective', 'Too big', 'Wrong color', 'Too small']})
merged_data = pd.merge(orders, returns, on=['customer_id', 'order_date'])
print(merged_data)

输出结果如下:

   order_id customer_id  order_date  order_value  return_id return_date return_reason
0         2         102  2020-01-02          200        NaN        NaN           NaN
1         3         101  2020-01-03          300        1.0  2020-01-02     Defective
2         4         103  2020-01-04          400        2.0  2020-01-03       Too big
3         5         104  2020-01-05          500        4.0  2020-01-04     Too small

七、总结

Pandas提供了多种方法来连接两个表,包括内连接、左连接、右连接和外连接等。我们可以根据具体情况选择适当的连接方式。在连接两个表时,需要注意连接键具有相同的数据类型和值范围,否则连接操作可能会失败。通过使用Pandas的连接方法,我们可以轻松地组合不同的数据集,以进行更深入的数据分析。