Python Pandas如何按Name匹配合并两个DataFrame生成新表
实现方案
核心逻辑
两个DataFrame通过公共字段Name做关联匹配即可:df1存储的是人员-所属团队的固定映射关系,df2存储的是按日期记录的人员状态全量明细。我们以明细数据所在的df2为基表做左连接,就能在不丢失任何一条原有状态记录的前提下,给每条记录匹配上对应的Team值,完全符合需求。
完整代码
首先确保已经安装pandas库,之后按如下步骤编写代码:
import pandas as pd # ---------------------- # 1. 构造测试数据(实际使用时替换为自己的df1、df2读取逻辑即可) # ---------------------- df1 = pd.DataFrame({ 'Name': ['John', 'Nathan', 'Eric'], 'Team': ['A', 'B', 'C'] }) df2 = pd.DataFrame({ 'Date': ['01/01/2022', '02/01/2022', '03/01/2022', '01/01/2022', '02/01/2022', '03/01/2022', '04/01/2022'], 'Name': ['John', 'John', 'John', 'Nathan', 'Nathan', 'Eric', 'Eric'], 'Status': ['Active', 'Active', 'Active', 'Active', 'Active', 'Deactivated', 'Active'] }) # ---------------------- # 2. 核心关联合并逻辑 # ---------------------- # 以Name为关联键,左连接保留df2全部明细 df3 = df2.merge(df1, on='Name', how='left') # 如果需要和示例一样把最后一列列名改为小写team,加这一行即可 df3 = df3.rename(columns={'Team': 'team'}) # ---------------------- # 3. 结果校验 # ---------------------- print(df3)
运行后输出结果和要求的df3结构完全一致:
Date Name Status team 0 01/01/2022 John Active A 1 02/01/2022 John Active A 2 03/01/2022 John Active A 3 01/01/2022 Nathan Active B 4 02/01/2022 Nathan Active B 5 03/01/2022 Eric Deactivated C 6 04/01/2022 Eric Active C
注意事项
- 如果数据里Name字段存在首尾空格、大小写不统一的情况,很容易出现匹配失败、Team列空值的问题,合并前可以先做简单清洗:
df1['Name'] = df1['Name'].str.strip().str.title() df2['Name'] = df2['Name'].str.strip().str.title() - 合并完成后可以用
df3[df3['team'].isna()]查看有没有匹配失败的记录,如果有输出说明df2里存在df1未登记团队信息的人员,需要补全维度数据。 - 如果确定两个表的Name值完全一一对应没有缺失,把
how='left'换成how='inner'得到的结果一致,但左连接容错性更高,不会意外丢失明细数据。
内容的提问来源于stack exchange,提问作者Isaac Portes
相关产品推荐
相关产品推荐

