如何基于年份偏移量在Pandas中合并多个DataFrame?
基于年份偏移量合并Pandas DataFrame的实现方案
核心需求是根据资金→员工→产出的年度滞后关系,将三个单类DataFrame合并为一个新表:每行包含N年的产出数据、N-2年的对应资金数据、N-1年的对应员工数据。
实现步骤与代码
首先补全最小可复现代码中的员工数据示例,然后分步骤完成合并:
import pandas as pd # 1. 定义原始数据框 # 产出数据 d = {'Name': ['ABC', 'DEF'], 'ID': [1, 2], 'Year': [2023, 2022], 'Output': [25, 51]} output_df = pd.DataFrame(data=d) # 资金数据 e = {'Name': ['ABC', 'DEF', 'ABC'], 'ID': [1, 2, 1], 'Year': [2021, 2020, 2023], 'Funding': [500, 1000, 17]} funding_df = pd.DataFrame(data=e) # 员工数据(补充示例) s = {'Name': ['ABC', 'DEF'], 'ID': [1, 2], 'Year': [2022, 2021], 'Staff': [18, 12]} staff_df = pd.DataFrame(data=s) # 2. 为产出数据框生成资金/员工的目标匹配年份 output_df['Funding_Year'] = output_df['Year'] - 2 # 产出年份N对应资金年份N-2 output_df['Staff_Year'] = output_df['Year'] - 1 # 产出年份N对应员工年份N-1 # 3. 合并资金数据:通过ID+目标资金年份匹配 combined_df = pd.merge( output_df, funding_df[['ID', 'Year', 'Funding']], # 仅保留需要匹配的列 left_on=['ID', 'Funding_Year'], # 左表用ID+资金目标年份 right_on=['ID', 'Year'], # 右表用ID+原始资金年份 how='left' # 保留所有产出数据,缺失匹配则显示NaN ).drop(columns=['Year_y']) # 删除合并后重复的年份列 # 4. 合并员工数据:同理通过ID+目标员工年份匹配 combined_df = pd.merge( combined_df, staff_df[['ID', 'Year', 'Staff']], left_on=['ID', 'Staff_Year'], right_on=['ID', 'Year'], how='left' ).drop(columns=['Year_y']) # 5. 调整列名至目标格式 combined_df = combined_df.rename(columns={ 'Name': '名称', 'ID': '编号', 'Year_x': '产出年份', 'Output': '产出', 'Funding_Year': '资金年份', 'Funding': '资金', 'Staff_Year': '员工年份', 'Staff': '员工' }) # 查看最终结果 print(combined_df)
关键细节说明
- 匹配逻辑:使用
pd.merge()的left_on和right_on参数,实现跨表的年份偏移匹配,而非直接按相同列名合并 - 数据保留策略:
how='left'确保所有产出数据都被保留,若某条产出数据没有对应的资金/员工数据,对应字段会显示NaN;若只需要完整匹配的数据,可改为how='inner' - 去重处理:如果资金/员工DataFrame中存在同一
ID+Year的重复数据,需先执行funding_df = funding_df.drop_duplicates(subset=['ID', 'Year'])避免合并后产生重复行
最终输出结果
| 名称 | 编号 | 产出年份 | 产出 | 资金年份 | 资金 | 员工年份 | 员工 |
|---|---|---|---|---|---|---|---|
| ABC | 1 | 2023 | 25 | 2021 | 500.0 | 2022 | 18.0 |
| DEF | 2 | 2022 | 51 | 2020 | 1000.0 | 2021 | 12.0 |
内容的提问来源于stack exchange,提问作者eschares
相关产品推荐
相关产品推荐

