使用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对象合并成一个更大的数据集。
多对一关系
在多对一关系中,一个表的某个列中的值对应另一个表中的多个值。例如,一个城市有多个人口普查区域,这时我们需要将两个表按照城市进行合并,就出现了多对一关系。下面让我们来看一个具体的示例。
假设我们有两个表格,cities
和populations
。
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()
方法,首先指定要连接的两个表为populations
和cities
,然后指定连接方式为左连接:how='left'
。接着使用on='city_id'
指定以city_id
列为基准进行连接。另外,由于只需要cities
表中的city_id
和city
两列,因此使用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()
方法完成操作,前者适用于简单的连接,后者适用于复杂的连接。掌握这些方法,相信能够更好地处理实际数据分析过程中的数据合并问题。