如何使用Pandas实现DataFrames间的多对多关联查询?
如何用Pandas实现多对多数据合并?
当然可以实现!这其实就是Pandas里非常常见的**多对多合并(many-to-many merge)**场景,刚好pd.merge()就能直接搞定,我来一步步给你讲清楚。
首先,先还原你的两个DataFrame方便测试:
import pandas as pd # 模拟server_list DataFrame server_list = pd.DataFrame({ 'Server': ['UK1010', 'UK1010', 'UK1010', 'UK1011'], 'Platform': ['Unix', 'Unix', 'Unix', 'Windows'], 'Package': ['Java', 'Java', 'Java', 'Java'], 'Version': ['1.1', '4.1', '5.0', '1.2'] }) # 模拟applications DataFrame applications = pd.DataFrame({ 'Server': ['UK1010', 'UK1010', 'UK1010'], 'Department': ['Accounting', 'Audit', 'CustomerForm'], 'Application': ['TaxMe', 'TaxCheck', 'FillIt'], 'Environment': ['PROD', 'PROD', 'PROD'] })
接下来只需要一行代码就能完成你想要的合并:
merged_df = pd.merge(server_list, applications, on='Server')
运行后你得到的merged_df就是你期望的格式:
| Server | Platform | Package | Version | Department | Application | Environment | |
|---|---|---|---|---|---|---|---|
| 0 | UK1010 | Unix | Java | 1.1 | Accounting | TaxMe | PROD |
| 1 | UK1010 | Unix | Java | 1.1 | Audit | TaxCheck | PROD |
| 2 | UK1010 | Unix | Java | 1.1 | CustomerForm | FillIt | PROD |
| 3 | UK1010 | Unix | Java | 4.1 | Accounting | TaxMe | PROD |
| 4 | UK1010 | Unix | Java | 4.1 | Audit | TaxCheck | PROD |
| 5 | UK1010 | Unix | Java | 4.1 | CustomerForm | FillIt | PROD |
| 6 | UK1010 | Unix | Java | 5.0 | Accounting | TaxMe | PROD |
| 7 | UK1010 | Unix | Java | 5.0 | Audit | TaxCheck | PROD |
| 8 | UK1010 | Unix | Java | 5.0 | CustomerForm | FillIt | PROD |
为什么这能生效?
当你用pd.merge()基于Server列合并两个DataFrame时:
- 如果
server_list里某个Server有N条记录,applications里同一个Server有M条记录,Pandas会自动生成N*M条组合记录,完美实现你要的多对多关联。 - 默认的
how='inner'参数会只保留两边都存在的Server记录,刚好符合你的需求;如果需要保留所有Server(哪怕某一边没有对应记录),可以改成how='outer'。
补充小提示
如果你对pd.merge()的文档还有困惑,可以重点关注这几个核心参数:
on:指定用来关联的共同列名(必须两边都有)how:合并方式,可选inner(内连接,默认)、outer(外连接)、left(左连接)、right(右连接)left_on/right_on:如果两边用来关联的列名不一样,就用这两个参数分别指定
内容的提问来源于stack exchange,提问作者Bartek Malysz
相关产品推荐
相关产品推荐

