使用Pandas将多对一的关系合并DataFrame

使用Pandas将多对一的关系合并DataFrame

在数据分析过程中,我们经常需要将两个或多个表格通过一定的方式合并在一起,以获得更全面的信息。在实际场景中,多个数据表之间可能存在一对多或多对一的关系,本篇文章将介绍如何使用Pandas将多对一的关系合并DataFrame。

前置知识

在开始学习多对一关系合并DataFrame之前,我们需要掌握以下基本知识:

1. DataFrame

DataFrame是Pandas中最常用的数据结构之一,类似于Excel或SQL表格。DataFrame是由行和列组成的二维标记数组,可以进行许多操作。以下是一个简单的示例:

import pandas as pd

data = {"name": ["Tom", "Jerry", "Mary", "Tom", "Jerry"],
        "age": [20, 21, 19, 20, 21],
        "gender": ["Male", "Female", "Female", "Male", "Female"],
        "score": [89, 92, 85, 90, 91]}

df = pd.DataFrame(data)
print(df)

输出结果:

    name  age  gender  score
0    Tom   20    Male     89
1  Jerry   21  Female     92
2   Mary   19  Female     85
3    Tom   20    Male     90
4  Jerry   21  Female     91

2. 合并DataFrame

Pandas提供了多种合并DataFrame的方式,其中最常用的是concat()merge()join()方法。简单说,这些方法的作用是将数据从不同的DataFrame对象合并成一个更大的数据集。

多对一关系

在多对一关系中,一个表的某个列中的值对应另一个表中的多个值。例如,一个城市有多个人口普查区域,这时我们需要将两个表按照城市进行合并,就出现了多对一关系。下面让我们来看一个具体的示例。

假设我们有两个表格,citiespopulations

import pandas as pd

data1 = {"city_id": [1, 2, 3],
         "city": ["New York", "Los Angeles", "Chicago"],
         "state": ["NY", "CA", "IL"]}

data2 = {"city_id": [1, 1, 1, 2, 2, 3],
         "area": ["Manhattan", "Bronx", "Queens", "Hollywood", "Santa Monica", "Loop"],
         "population": [1600000, 500000, 2300000, 1500000, 900000, 2700000]}

cities = pd.DataFrame(data1)
populations = pd.DataFrame(data2)

其中,cities表中包含城市的基本信息,populations表中则包含区域及人口数。

1. concat方法

首先,我们可以使用concat()方法将两个表进行拼接。由于cities表中的city_id列和populations表中的city_id列对应关系为多对一,因此我们需要在populations表中添加一列来与cities表中的city_id列对应:

populations2 = pd.concat([populations, cities['city']], axis=1)
print(populations2)

这里将populations表与cities['city']列进行连接,得到拼接后的populations2表:

   city_id          area  population         city
0        1     Manhattan     1600000     New York
1        1         Bronx      500000     New York
2        1        Queens     2300000     New York
3        2     Hollywood     1500000  Los Angeles
4        2  Santa Monica      900000  Los Angeles
5        3          Loop     2700000     Chicago

可以看到,此时populations2表中多了一个city列,表示每个区域所属的城市名称。

2. merge方法

另一个常用的方法是merge()。与concat()不同的是,merge()是基于某些列进行合并的,并且可以指定连接方式。对于多对一关系,我们需要以cities表中的city_id列和populations表中的city_id列进行连接。

populations3 = pd.merge(populations, cities[['city_id', 'city']], on='city_id', how='left')
print(populations3)

这里使用merge()方法,首先指定要连接的两个表为populationscities,然后指定连接方式为左连接:how='left'。接着使用on='city_id'指定以city_id列为基准进行连接。另外,由于只需要cities表中的city_idcity两列,因此使用cities[['city_id', 'city']]进行筛选。

输出结果:

   city_id          area  population         city
0        1     Manhattan     1600000     New York
1        1         Bronx      500000     New York
2        1        Queens     2300000     New York
3        2     Hollywood     1500000  Los Angeles
4        2  Santa Monica      900000  Los Angeles
5        3          Loop     2700000     Chicago

可以看到,populations3表中多了一个city列,表示每个区域所属的城市名称。

结论

在实际数据分析中,多对一关系是一种非常常见的数据关系,本文介绍了如何使用Pandas将多对一关系合并DataFrame。我们可以使用concat()merge()方法完成操作,前者适用于简单的连接,后者适用于复杂的连接。掌握这些方法,相信能够更好地处理实际数据分析过程中的数据合并问题。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程